7

私は DirectXMath のドキュメントを読んでいて、次の文章に出くわしました:

new/delete をオーバーロードして C++ クラスでアライメントを直接強制する代わりに、pImpl イディオムを使用できます。Impl クラスが __aligned_malloc を介して内部的に整列されていることを確認すると、内部実装内で整列された型を自由に使用できます。これは、'public' クラスが Windows ランタイム ref クラスであるか、std::shared_ptr<> での使用を意図している場合に適したオプションです。

shared_ptr がアラインメント戦略を変更する方法がわかりません。ポインターしかなく、オブジェクトを割り当てません。

4

2 に答える 2

12

そうです、std::shared_ptrアライメントには影響しません。すでに割り当てられているオブジェクトへのポインターを受け取るだけなので、その割り当てによってオブジェクトの位置がずれている場合、問題は ではなく、std::shared_ptrその割り当てにあります。

しかし、std::shared_ptrと一緒に使用されることがよくありstd::make_sharedます。std::make_shared<T>単一の割り当てを実行して、std::shared_ptr制御構造とTインスタンスの両方にメモリを予約します。この割り当ては、クラス固有のものを使用して行われることはありませoperator newん (そうすべきではありません)。クラス固有operator newの設定がデフォルト アロケータよりも厳密なアラインメントを設定している場合、デフォルト アロケータが使用されたときにこれがどのように失敗するかは簡単にわかります。

于 2015-07-05T09:51:26.987 に答える