Hug*_*ite 1 c++ placement-new reinterpret-cast
通过阅读这篇文章,很明显c ++中的放置新闻用于在预先分配的内存位置上调用类构造函数.
在内存已经初始化的情况下,是新的贴图还是reinterpret_cast更合适?
例如,假设我读取了一个原始字节流,表示来自TCP套接字的成帧消息.我把这个流放入一个framesync并检索一个代表我的类的已知大小的缓冲区,我称之为Message.我知道有两种方法可以继续.
创建一个带有标志的构造函数,告诉类不要初始化.通过"不初始化"标志在缓冲区上执行new放置.
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 );
Run Code Online (Sandbox Code Playgroud)使用reinterpret_cast
Message* message = reinterpret_cast< Message* > ( buffer );
Run Code Online (Sandbox Code Playgroud)我相信这两者都会产生相同的结果.一个优先于另一个是更正确,更OO,更安全,更容易阅读或更好的风格?
唯一有意义的规则是:
如果某些类型的实例T也已经被在地址构造a,然后reinterpret_cast<T*>(a)获得一个指向该对象已存在.
如果某些类型的实例T还没有被在地址构造a,然后用放置新的构造类型的实例T在ADDRES a.
它们是完全不同的操作.
你需要问的问题非常非常简单:"对象是否已经存在?" 如果是,您可以访问它(通过演员表).如果不是,那么你需要构建它(通过放置新的)
这两项行动与彼此无关.
这不是你应该选择哪一个的问题,因为他们做了不同的事情.你应该更喜欢做你想要的那个.