Reinterpret_cast vs placement new

Hug*_*ite 1 c++ placement-new reinterpret-cast

通过阅读这篇文章,很明显c ++中的放置新闻用于在预先分配的内存位置上调用类构造函数.

在内存已经初始化的情况下,是新的贴图还是reinterpret_cast更合适?

例如,假设我读取了一个原始字节流,表示来自TCP套接字的成帧消息.我把这个流放入一个framesync并检索一个代表我的类的已知大小的缓冲区,我称之为Message.我知道有两种方法可以继续.

  1. 创建一个带有标志的构造函数,告诉类不要初始化.通过"不初始化"标志在缓冲区上执行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)
  2. 使用reinterpret_cast

    Message* message = reinterpret_cast< Message* > ( buffer ); 
    
    Run Code Online (Sandbox Code Playgroud)

我相信这两者都会产生相同的结果.一个优先于另一个是更正确,更OO,更安全,更容易阅读或更好的风格?

jal*_*alf 9

唯一有意义的规则是:

如果某些类型的实例T已经被在地址构造a,然后reinterpret_cast<T*>(a)获得一个指向该对象存在.

如果某些类型的实例T没有被在地址构造a,然后用放置新的构造类型的实例T在ADDRES a.

它们是完全不同的操作.

你需要问的问题非常非常简单:"对象是否已经存在?" 如果是,您可以访问它(通过演员表).如果不是,那么你需要构建它(通过放置新的)

这两项行动与彼此无关.

这不是你应该选择哪一个的问题,因为他们做了不同的事情.你应该更喜欢做你想要的那个.

  • @ user1210290:这些规则的来源是语言定义.#1会创建一个新对象,可能会覆盖现有数据,这根本不是您想要做的; #2将现有数据重新解释为不同的类型,这就是您想要的 - 只要它是布局与数据匹配的标准布局类型. (2认同)