enable_shared_from_thisは同じ最適化を提供しますか?したがって:
番号標準の文言からわかるように、enable_shared_from_this<T>
にはweak_ptr<T>
というデータメンバーがあります。これは、参照カウントを含むコントロールブロックへのポインタを持つクラスにweak_ptr<T>
を追加します。参照カウントは直接含まれません。参照カウントを含む制御ブロックは依然としてオブジェクトの外部に存在する。
参照カウントを含む制御ブロックは、オブジェクトを参照していた他のweak_ptr
オブジェクトが制御ブロックにアクセスして、有効期限が切れていないかどうかを確認できるように、オブジェクトより長く存続する必要があります。
コントロールブロックがオブジェクトの内部にある場合、オブジェクトが破棄されたときに破棄され、ダングリングweak_ptr
がオブジェクトの有効期限が切れているかどうかを安全に判断できません。理論的には、制御ブロックのメモリは割り当てられたままになり、依然として使用され、参照カウントは更新されましたが、たとえそのオブジェクトが破壊されても更新されましたが、それはかなり醜いようです(そして、オブジェクトはdelete
明示的なデストラクタ呼び出しとメモリを解放する明示的なoperator delete
呼び出しが必要です)。
所有者shared_ptr
がカスタムディテクタまたはカスタムアロケータで作成されている場合は、埋め込みコントロールブロックを使用できません。これらのオブジェクトのサイズはあらかじめわかっていないためです。そのような場合には、さらにenable_shared_from_this<T>
ベースクラスに埋め込まれたものに加えて、に加えて外部制御ブロックを割り当てる必要があり、さらに多くのスペースを浪費します。
2つは完全に直交しています。 'enable_shared_from_this'はあなたが既に*共有ポインタを持っているときに関係します。 –
@KerrekSB私は、共有ポインタの実装で使用できるクラスにenable_shared_from_thisがいくつかのデータを追加するとします。私にとって最も簡単な方法は、enable_shared_from_thisの一部として参照の数を配置することです。これは、最初のケースでのメモリ割り当てを減らすのに役立ちます。 –
私は "yes"と言ってしまいます。さもなければ、オブジェクト内部からrefcountブロックを取り出す方法がないからです。しかし、それはちょうど感傷です。 – Quentin