ホームページ > バックエンド開発 > C++ > `std::make_shared` と `std::shared_ptr`: どちらが効率的ですか?

`std::make_shared` と `std::shared_ptr`: どちらが効率的ですか?

Barbara Streisand
リリース: 2024-12-14 02:04:10
オリジナル
642 人が閲覧しました

`std::make_shared` vs. `std::shared_ptr`: Which is More Efficient?

std::make_shared と std::shared_ptr の直接使用の効率の識別

std::make_shared と std を直接構築する場合の効率の違いを理解します。 :shared_ptr は複雑なタスクになる可能性があります。ここでは、各メソッドの複雑さを解明するために詳細な比較を掘り下げます。

構築シーケンスの探索

次のコード スニペットを考えてみましょう:

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
std::shared_ptr<Object> p2(new Object("foo"));
ログイン後にコピー

直接 std::shared_ptr構築:

  1. オブジェクトのヒープ割り当て
  2. 共有ポインター コンストラクター、メタデータ用に別のヒープ領域を割り当てます

std::make_shared使用法:

  1. オブジェクトとメタデータの両方を含む結合されたヒープ割り当て

効率の向上を明らかにする

主な違いは、ヒープ割り当てrequired:

  • make_shared: 1 割り当て
  • Directshared_ptr: 2 割り当て

この単一の割り当てmake_shared では、明示的な新しい呼び出しの必要性がなくなり、その結果、

例外に関する考慮事項

Pre-C 17:
生のポインタが安全にshared_ptrに渡されなかった可能性があるため、以前は例外処理が大混乱を引き起こす可能性がありました。コンストラクター。

C 17 およびその後:
この問題は、関数の引数の評価順序の変更により解決されました。現在、例外は適切に処理され、メモリの整合性が確保されています。

std::make_shared の小さな欠点

Casey が指摘したように、潜在的な欠点は単一の割り当てに起因します:

  • 制御されたメモリは、制御ブロックが使用されなくなるまで解放できません。ポインタが弱いため、メモリ保持が長くなる可能性があります。参照。

以上が`std::make_shared` と `std::shared_ptr`: どちらが効率的ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート