この投稿と@kerek SB州による回答の1つに出くわしました
std::shared_ptr<Object> p1 = std::make_shared<Object>("foo"); std::shared_ptr<Object> p2(new Object("foo"));
コードでは、2 番目の変数はネイキッド ポインターであり、共有ポインターではありません。
今、肉に。make_shared は (実際には) より効率的です。これは、参照制御ブロックを実際のオブジェクトと共に 1 つの動的割り当てで割り当てるためです。対照的に、ネイキッド オブジェクト ポインターを受け取る shared_ptr のコンストラクターは、参照カウント用に別の動的変数を割り当てる必要があります。トレードオフは、割り当てがアロケータによって実行されるため、make_shared (またはその従兄弟の allocate_shared) ではカスタムのデリータを指定できないことです。
(これは、オブジェクト自体の構成には影響しません。オブジェクトの観点からは、2 つのバージョンに違いはありません。より効率的なのは、管理対象オブジェクトではなく、共有ポインター自体です。)
この投稿に関して2つの質問があります。誰かがこれを明確にしてくれれば幸いです
2 番目のポインタが共有ポインタではないのはなぜですか? それは参照カウントをインクリメントしませんか
make_shared は 1 つのメモリ割り当てのみを作成し、new は 2 つを作成して make_shared をより効率的にするにはどうすればよいですか?
これについて少し説明していただければ幸いです。