make_sharedのブーストドキュメントには、次のように書かれています。
利便性とスタイルに加えて、このような関数は、オブジェクトとそれに対応する制御ブロックの両方に単一の割り当てを使用でき、shared_ptrの構築オーバーヘッドのかなりの部分を排除できるため、例外安全でかなり高速です。
「シングルアロケーション」の意味がわかりませんが、どういう意味ですか?
make_sharedのブーストドキュメントには、次のように書かれています。
利便性とスタイルに加えて、このような関数は、オブジェクトとそれに対応する制御ブロックの両方に単一の割り当てを使用でき、shared_ptrの構築オーバーヘッドのかなりの部分を排除できるため、例外安全でかなり高速です。
「シングルアロケーション」の意味がわかりませんが、どういう意味ですか?
「割り当て」とは、アロケータの呼び出しから取得されたメモリのブロックを意味します。
通常、shared_ptr
ポインタコンストラクタを使用してを作成すると、参照カウントと削除機能を保持する「制御ブロック」にメモリが割り当てられます。そのすべてのコピーはshared_ptr
同じ制御ブロックを参照するため、参照カウントを共有します。したがって、合計で2つの割り当てがあります。オブジェクト自体とによって作成された制御ブロックですshared_ptr
。
オブジェクトを作成し、とshared_ptr
一緒に作成するとmake_shared
、1つの割り当てのみが行われます。これは、2つのメンバーを持つ単一の構造体と考えることができます。
shared_ptr
参照カウント用のスペースを割り当てる必要があります。これは、オブジェクトを動的に作成し(1つの割り当て)、それをに渡しshared_ptr
、次にカウントを割り当てる(2番目の割り当て)ことを意味します。make_shared
十分な大きさの単一の割り当てを実行してから、カウントとオブジェクトの両方を適切に構築します。