[解決済み] コピーエリジョンと戻り値の最適化とは何ですか?
質問
コピーエリジョンとは何ですか?戻り値の最適化(名前付き)とは何ですか?これらは何を意味しているのですか?
どのような場合に発生するのでしょうか?また、どのような制限がありますか?
- この質問を参照された方は、おそらく次のようなものを探していると思います。 序章 .
- 技術的な概要については 標準リファレンス .
- 参照 よくある事例 こちら .
解決方法は?
はじめに
技術的な概要については この回答へスキップする .
コピーエリジョンが発生する一般的なケースについて-。 この回答へスキップする .
コピーエリジョンとは、ほとんどのコンパイラが実装している最適化で、特定の状況下で余分な(高価になりうる)コピーを防止するためのものです。これにより、値による戻り値や値による受け渡しが実際に可能になります(制限が適用されます)。
これは、as-ifルールを無視した(ハ!)唯一の最適化の形です -。 オブジェクトのコピー/移動が副作用を伴う場合でも、コピーエリジョンを適用できます。 .
次の例は ウィキペディア :
struct C {
C() {}
C(const C&) { std::cout << "A copy was made.\n"; }
};
C f() {
return C();
}
int main() {
std::cout << "Hello World!\n";
C obj = f();
}
コンパイラの & 設定により、以下のように出力されます。 はすべて有効です。 :
ハローワールド
コピーが作成されました。
コピーが作成されました。
ハローワールド
コピーが作成されました。
ハローワールド
これはまた、生成できるオブジェクトの数が少ないことを意味し、特定の数のデストラクタが呼び出されることに依存することもできません。コピー/ムーブコンストラクタやデストラクタの内部には、クリティカルなロジックを入れてはいけません。
コピーまたは移動のコンストラクタの呼び出しが省略された場合でも、そのコンストラクタは存在し、アクセス可能でなければなりません。これにより、コピーや移動のコンストラクタが非公開または削除されているなどの理由で、通常はコピーできないオブジェクトがコピーされないようにします。
C++17 : C++17 では、オブジェクトが直接返される場合、Copy Elision が保証されます。
struct C {
C() {}
C(const C&) { std::cout << "A copy was made.\n"; }
};
C f() {
return C(); //Definitely performs copy elision
}
C g() {
C c;
return c; //Maybe performs copy elision
}
int main() {
std::cout << "Hello World!\n";
C obj = f(); //Copy constructor isn't called
}
関連
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] C++のPOD型とは何ですか?
-
[解決済み】C++17の新機能は何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】デバッグアサーションに失敗しました