[解決済み] C++のスマートポインタのオーバーヘッドは通常のポインタと比較してどの程度ですか?
質問
C++11 のスマート ポインターは、通常のポインターと比較してどの程度のオーバーヘッドがありますか。言い換えると、スマート ポインターを使用した場合、私のコードは遅くなるのでしょうか、また、遅くなる場合はどのくらい遅くなるのでしょうか。
具体的には、私は C++11 の
std::shared_ptr
と
std::unique_ptr
.
スマート ポインターはその内部状態 (参照カウントなど) も保存する必要があるため、スタックに押し込まれるものが大きくなるのは明らかですが (少なくとも私はそう思います)、問題は、これがパフォーマンスにどの程度影響するのか (まったく影響しないとしたら) です。
たとえば、私は関数から通常のポインタの代わりにスマートポインタを返します。
std::shared_ptr<const Value> getValue();
// versus
const Value *getValue();
例えば、ある関数が通常のポインタの代わりにスマートポインタをパラメータとして受け取る場合です。
void setValue(std::shared_ptr<const Value> val);
// versus
void setValue(const Value *val);
どのように解決するのですか?
std::unique_ptr
は、自明でないデレタと一緒に提供した場合のみ、 メモリのオーバーヘッドを持ちます。
std::shared_ptr
は常に参照カウンタのためのメモリオーバーヘッドを持ちますが、それは非常に小さいものです。
std::unique_ptr
はコンストラクタ中(提供されたデレタをコピーしたり、ポインタをヌル初期化する必要がある場合)とデストラクタ中(所有するオブジェクトを破壊する)のみ時間のオーバーヘッドを持ちます。
std::shared_ptr
は、コンストラクタ(参照カウンタを作成する)、デストラクタ(参照カウンタをデクリメントし、場合によってはオブジェクトを破壊する)、および代入演算子(参照カウンタをインクリメントする)において時間オーバーヘッドを持っています。スレッドセーフを保証するために
std::shared_ptr
のスレッドセーフ保証により、これらのインクリメント/デクリメントはアトミックであり、したがって、いくつかのより多くのオーバーヘッドを追加します。
デリファレンス(所有するオブジェクトへの参照を取得すること)の時間的オーバーヘッドは、どれもないことに注意してください。
まとめると、多少のオーバーヘッドはありますが、スマートポインタの作成と破棄を継続的に行わない限り、コードが遅くなることはないはずです。
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] JavaScriptでオブジェクトのキー/プロパティの数を効率的にカウントする方法
-
[解決済み] リファレンスとポインタの使い分け
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】'cout'は型名ではない
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】変数やフィールドがvoid宣言されている