通过阅读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 );
    
  • 使用reinterpret_cast
    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/

    10-09 06:24