問題タブ [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++ - ここで NRVO が適用されないのはなぜですか?
このコードを VS2010 で実行すると、NRVO が適用されません。
編集:これはデストラクタと関係があります。その行をコメントアウトすると、NRVO が使用されます。しかし、これはなぜですか?
c++ - ファクトリを使用してタプルを埋め、コピーを回避する
次のパターンが発生する (C++98) プログラムを作成しようとしています: 非常に単純な汎用タプル クラスがあり、ファクトリを使用して構築された値で埋める必要があります。最小限のサンプル コードは次のとおりです。
出力は
真ん中の2行をなくしたいです。
説明を簡単にするために、上記のコードで (*) とマークされた行のコメントを外すことができます。これは汎用性を壊しますが、プログラムは壊しません。
ここで私の主な質問に移ります:どうすればこの状況を解決できますか? RVO を防止する標準の何かがありますか (おそらく RVO はここで再帰的に実行する必要があります)。そうでない場合、コンパイラが十分ではないことを受け入れて、これを明示的な方法で発生させる方法はありますか? create() の呼び出し側を複雑にすることは問題ありませんが、タプル内のオブジェクトを複雑にしたくありません (特に、それらのいくつかはデフォルトで構築できず、追加の「初期化」を導入したくありません)。それらに状態)。新しい多分助けを設置できますか?
次の質問は関連しているように見えますが、最終的には役に立ちませんでした: RVO がここで発生しないのはなぜですか? )
c++ - 名前付き戻り値の最適化に頼る必要があるのはなぜですか?
私は NRVO について読んでいて、NRVO に頼るべきときとそうでないときを理解しようとしていました。ここで質問があります。なぜ NRVO に頼る必要があるのでしょうか。戻りパラメータを明示的に参照渡しすることは常に可能ですが、代わりに NRVO に依存する理由はありますか?
c++ - NRV(名前付き戻り値) コピーコンストラクタ
最近、「c++ のオブジェクト モデルの内部」を読んでいて、第 5 章を読んでいるときに、次の質問を思いつきました。
クラスにコピー コンストラクターがある場合でも、コンパイラーは NRVO を処理しますか?
c++ - RVO および NRVO の最適化 + C++11 移動演算子
RVO と NRVO が新しい C++11 移動演算子と共にどのように機能するかを理解しようとしています。いくつかの例を含むダミー クラスを起草しました。
編集: コードの最も重要な部分のみが表示されます。
完全なソース コードはこちらから入手できます。
クラスを参照として取得し、値または参照を返す 2 つの関数があります。
これらの関数を呼び出すと、出力として次のようになります。
左辺値参照が使用されている場合、コピー コンストラクターは呼び出されません。それ以外の場合、それらの関数 (パラメーターとして参照を受け取る) は引き続きコピー コンストラクターを呼び出します。
この機能はコンパイラに依存していますか? 私は何か間違ったことをしていますか?
c++ - clang が NRVO でこれを最適化しないのはなぜですか?
適度に優れた C++ 11 コンパイラ (clang) がこのコードを最適化しない理由を説明しようとしています。
これを#define SLOW
コメントアウトして最適化して実行すると-s
、
これは予想されます。
これを#define SLOW
有効にして最適化して実行すると、次の-s
ようになります。
これは明らかにそれほど良くありません。質問は次のとおりです。
「SLOW」の場合に適用された NRVO 最適化が表示されないのはなぜですか? コンパイラが NRVO を適用する必要がないことは知っていますが、これは非常に一般的な単純なケースのようです。
一般的に、私は「SLOW」スタイルのコードを推奨するようにしています。これは、デバッグがはるかに簡単だからです。
c++ - C++: RVO、NRVO、およびローカル オブジェクトを返す
RVO (Return Value Optimization) と NRVO (Named Return Value Optimization) について読みました。以下に 2 つの例を示します
それは理にかなっており、優れたコンパイラの最適化です。ただし、Stanley Lippman の「C++ 入門書」から、「ローカル オブジェクトへの参照またはポインターを返さない」(ch 6.3.2) を読みました。コード例は次のとおりです。
わかりません。この例は RVO の例とどこか違うのでしょうか? それらが同じである場合、呼び出しスタックの巻き戻しによる未定義の動作を引き起こす代わりに、コンパイラーが RVO 最適化を行うようにするにはどうすればよいでしょうか?