問題タブ [copy-elision]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - std::vector 初期化要素の移動/コピー コンストラクター
私はこのコードを持っています:
g++ -std=c++11 --no-elide-constructors
出力は私が期待するものです(フラグなしで同じ出力でコンパイルされます)
ベクトルをpush_back
直接初期化する代わりに、v
出力が得られる理由がわかりません:
1) (なし--no-elide-constructors
)
2) (と--no-elide-constructors
)
最初のケースでは、なぜ copy ctor が呼び出されるのでしょうか? そして 2 番目のケースでは、コンパイラが省略を実行しない場合、move ctor が 2 回呼び出される理由がまったくわかりません。何か案は?
c++ - C++ Builder (Clang) で RVO を無効にする方法は?
私は C++ Builder XE6 を使用しています。結果をコピー コンストラクターと比較するために、ムーブ コンストラクターでいくつかのテストを実行しようとしています。とにかく、コンパイラ設定で「すべての最適化を無効にする」がチェックされていても、私のコンパイラは RVO 最適化を強制します。コンパイラに送信する必要がある追加のパラメータはありますか?
c++ - std::moveなしでunique_ptrを値で返すにはどうすればよいですか?
上記のコードでは、関数ptr()
は のコピーを返しますp
。範囲外にp
なると、データ「3」が削除されます。しかし、コードはアクセス違反なしでどのように機能するのでしょうか?
c++ - 関数の戻り値でオブジェクトを初期化するときに呼び出されないコピー コンストラクター
次のコードを検討してください。
上記のコードの出力は次のとおりg++ file.cpp
です。
上記のコードの出力は次のとおりg++ -fno-elide-constructors file.cpp
です。
私は戻り値の最適化を知っています。私の質問は、コンストラクターをコピーするための呼び出しが省略されていることです(返されたオブジェクトまたは返されたオブジェクトが b にコピーされている間)?
省略されたコピー コンストラクターが b の作成に使用されるものである場合、b はどのように作成されるのでしょうか (この場合もコンストラクター呼び出しがないため)。
A b = a.fun(c);
行を置き換えてa.fun(c)
、最初の方法または 2 番目の方法を使用してコンパイルすると、コピー コンストラクターも 2 回呼び出されます。では、前の段落で説明したケースで一時オブジェクトのコピー コンストラクターが省略されている場合、この場合はなぜ省略されないのでしょうか。
c++ - オーバーロードされた + 演算子からオーバーロードされた = 演算子に戻るときにコピー コンストラクターが呼び出されない
次のコードを検討してください。
コマンド: を使用してこのプログラムをコンパイルするg++ file.cpp
と、出力は次のようになりました。
次に、コマンドを使用してこのプログラムをコンパイルします: g++ -fno-elide-constructors file.cpp
、出力は次のとおりです。
私の質問は:
最初のケースで、2 つのコピー コンストラクターが省略されているのはなぜですか?
とにかく、どのコピーコンストラクターが省略されていますか? = 演算子または + 演算子には別のメカニズムがありますか
編集
正しい代入演算子またはコピー コンストラクターがどのように見えるべきかを知っています。代入演算子を修正するのではなく、上記のケースで 2 つのコピー コンストラクターが省略されている理由を答えてください。