問題タブ [nrvo]
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++ - 配列からunique_ptr要素を値で返すことはできません
以下はコンパイルされ、期待どおりに動作します。
しかし、これはしません:
g++ 出力:error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = char; _Dp = std::default_delete<char>]
いくつかの SO 調査から Returning unique_ptr from functionsと、ペアから unique_ptr を返せないのはなぜですか? これはすべて、コピー省略と名前付き戻り値の最適化に関連しているようです。
私の推測が正しいかどうか誰かが確認できますか. もしそうなら、NRVOを適用できる ようにするためのコピーエリソンの基準は正確には何ですか?
c++ - RVO は "new" で動作しますか?
この状況でコピー省略が発生しますか? 言い換えれば、コピー省略を使用する最新のコンパイラは、ここでコピー コンストラクターを呼び出すことを回避しますか?
オブジェクトをポインターに格納することを目指しています。オブジェクトは関数によって返されます。コピーせずに保存したい。
C++11が使えない
c++ - (N)RVO は、値が既存のオブジェクトにコピーされているときにも発生しますか?
(N)RVO は、戻り値が新しい変数に代入されるときに一時オブジェクトの不要なコピーと作成を回避するのに役立ちます (したがって、コピー コンストラクターを回避します)。
したがって、次のようなものは RVO で最適化する必要があります。
しかし、呼び出しサイト オブジェクトが既に存在する場合にも発生しますか? (=
つまり、コピー コンストラクターの代わりに演算子が使用される場合)。私はこれに関する文献を見つけようとしましたが、(N)RVO は常にコピー コンストラクターを回避するという観点から説明されているようです。この場合、呼び出しサイト オブジェクトを変更しても実際に安全かどうかはわかりません。
c - 純粋な C の gcc で名前付き戻り値の最適化を無効にする
C 言語の名前付き戻り値の最適化を制御するフラグが見つかりませんでした。C++ の場合は -fno-elide-constructors のようです。
これを実装したソースコードはこちらですが、ミドルエンドなのでコメントでもフロントエンドの情報はネタバレしていません。 マニュアルセクションも正確には役に立ちませんでした。ただし、逆アセンブルすると、O0 でオフになり、O1 で有効になるため、次のいずれかである必要があります。
C コード:
O0 でコンパイルすると、「コピー」構造が単純にスタックに割り当てられていることがわかります。
O1 でコンパイルすると、割り当てられませんが、ポインターが暗黙の引数として渡されます
c++ - 新しい変数を導入すると、値の最適化が無効になりますか?
我々はすべてそれを知っている
Foo
戻り値の最適化を使用してコンパイルされるため、コピー コンストラクターに副作用があっても値のコピーは取得されません。しかし、
それも?2 番目の構文は、デバッグ時に役立ちます。しかし、そうすることで重要な最適化を捨てているのでしょうか? おそらく、明示的な移動コンストラクターを作成する必要がありますか?