通过阅读this post,很明显,使用c++中的放置新闻可以在预分配的内存位置上调用类构造函数。
如果内存已经初始化,那么放置新的位置还是reinterpret_cast更合适?
例如,假设我从TCP套接字读取了代表帧消息的原始字节流。我将此流放入framesync中,并检索了一个代表我的类的已知大小的缓冲区,我将其称为Message。我知道有两种处理方法。
Message::Message( bool initialize )
{
//
// Initialize if requested
//
if( initialize )
{
Reset( );
}
}
void Message::Reset( void )
{
m_member1 = 1;
m_member2 = 2;
}
Message* message = new ( buffer ) Message( false );
Message* message = reinterpret_cast< Message* > ( buffer );
我相信这两者都会产生相同的结果。是一种比另一种更正确,更OO,更安全,更易于阅读或更好的样式吗?
最佳答案
唯一有意义的规则是:
如果已经在地址T
处构造了某种类型a
的实例,则reinterpret_cast<T*>(a)
可获得指向已存在的对象的指针。
如果尚未在地址T
处构造某种类型a
的实例,则使用placement new在addres T
处构造一个a
类型的实例。
它们是完全不同的操作。
您需要问的问题非常非常简单:“对象是否已经存在?”
如果是,则可以(通过强制转换)访问它。如果否,则需要构造它(通过新放置)
这两个操作彼此无关。
这不是您应该选择哪一个的问题,因为它们会做不同的事情。您应该更喜欢一种可以满足您需求的产品。
关于c++ - Reinterpret_cast与展示位置新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11635163/