この投稿を読むと、事前に割り当てられたメモリ位置でクラス コンストラクターを呼び出すために C++ の配置ニュースが使用されていることが明らかです。
メモリが既に初期化されている場合、新しい配置または reinterpret_cast のどちらがより適切ですか?
たとえば、フレーム化されたメッセージを表す生のバイト ストリームを TCP ソケットから読み取ったとします。このストリームを framesync に入れ、クラスを表す既知のサイズのバッファーを取得します。これを Message と呼びます。私は、次の 2 つの方法を知っています。
クラスに初期化しないように指示するフラグを受け取るコンストラクターを作成します。「初期化しない」フラグを渡してバッファに新しい配置を行います。
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 );
どちらも同じ結果になると思います。どちらがより正確で、よりオブジェクト指向で、より安全で、読みやすく、またはより良いスタイルであるため、どちらが好まれますか?