問題タブ [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.

0 投票する
1 に答える
927 参照

c++ - C++: return ステートメントで明示的に std::move() を使用して移動を強制する必要がありますか?

編集:この質問はO0でのコンパイラの決定について尋ねるため、重複ではありません。

ここでは、Name Return Value Optimization (NRVO) は、多くのコンパイラがサポートする最適化であると言われています。しかし、それは必須の最適化ですか、それともあると便利な最適化ですか?

私の状況では、-O0デバッグの便宜上 (つまり、最適化なしで) コンパイルしたいのですが、オブジェクト (ベクトルなど) を返す return ステートメントに対しても NRVO を有効にしたいと考えています。-O0NRVO が必須でない場合、コンパイラはおそらくモードでそれを行いません。この場合、次のコードを優先する必要があります。

この下に?

編集: 私が使用しているコンパイラは GCC6 ですが、コードをコンパイラに依存しないようにしたいと考えています。

0 投票する
1 に答える
72 参照

c++ - メンバー アクセスの C++ コピー

私は、コピー省略、RVO、NRVO のケースとは別に、いつコピーが実行されるかを確認するためにいくつかの実験を行っていました。

そこで、次のようなコードを書きました。

出力として以下を受け取ります。

-O3 を使用して gcc または clang でコンパイルし、 -std=c++{11,14,17} を試した場合、両方とも同じ出力が生成されました。

驚いたことに、y.getX(); を使用するときにコピーが実行されるとは思っていませんでした。const 変数に。これは、次のコードでその変数とそのメンバーへのアクセスを容易にするために頻繁に使用したものですが、const 参照ではなく、コンパイラーが名前変更と見なすことを期待して const を使用していました。

そのコピーが正確に実行される理由を誰かが知っていますか? 私の頭に浮かぶ唯一の理由は、コードをスレッドセーフにすることです。オブジェクト y を操作するスレッドが複数ある場合、const への割り当ては結局その const にはなりません。オブジェクトyのメンバーxを参照するだけなので。他のスレッドによって変更される可能性があります。しかし、それが本音かどうかはわかりません。

0 投票する
2 に答える
798 参照

c++ - 括弧内に return ステートメントがある C++ nrvo/copy 省略

私は次のコードをいじっていましたが、Visual Studio 2017 アプリケーションと 2 つの異なるオンライン コンパイラを使用して異なる結果を得ました。リリース モードでは、ビジュアル スタジオはどちらの場合もコピー/移動を省略しますが、2 つのオンライン コンパイラは、括弧で囲まれていない return ステートメントの場合にのみそれを行います。私の質問は、誰が正しいかということです。さらに重要なのは、その根底にあるルールは何かということです。(括弧を構文と組み合わせて使用​​できることは知っていますdecltype(auto)が、これは現在のユースケースではありません)。

コード例:

オンライン コンパイラ 1: http://cpp.sh/75bux

オンライン コンパイラ 2: http://coliru.stacked-crooked.com/a/c266852b9e1712f3

リリース モードでの Visual Studio の出力は次のとおりです。

他の 2 つのコンパイラでは、出力は次のようになります。

0 投票する
1 に答える
443 参照

c++ - (N)RVOがある場合、移動コンストラクターが実際に呼び出されるのはいつですか?

SO に関するいくつかの質問から、(N)RVO は、オブジェクトが値によって返されるときに移動コンストラクターが呼び出されないようにすることを理解しました。古典的な例:

(N)RVO を有効にした場合の出力は次のとおりです。

では、(N)RVO の存在に関係なく、move コンストラクターが呼び出されるのはどのような場合でしょうか? いくつか例を挙げていただけますか?言い換えれば、(N)RVO がデフォルトで最適化ジョブを実行する場合、なぜ移動コンストラクターを実装する必要があるのでしょうか?