問題タブ [rvo]
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++ - RVO が最大のパフォーマンスへの影響を示すのはいつですか?
RVO のパフォーマンスへの影響が、私が思っていたほど価値があるかどうかを理解しようと少し時間を費やしました。
これが私のベンチマークコードです(主なアイデアは、大きな構造を作成して関数から返すことです):
私の MacBook Pro では、このベンチマークは、RVO 最適化の有無にかかわらず、ほぼ同じパフォーマンスを示しています。
このような結果が得られると、コンパイラが RVO を提供していない場合でも意味的に見栄えがよくなるため、値による戻りの手法を常に使用する傾向があります。RVO が実際にパフォーマンスに重大な影響を与えるのはいつですか?
ベンチマークの要点へのリンク。
c++ - メンバ ベクトルを含むオブジェクトを値で返すのは悪い考えですか?
短縮版:
オブジェクトに std::vector が含まれている場合、ベクトルを値で返す場合と同じ経験則が、そのオブジェクトを値で返す場合に適用されますか?
値によってベクトルを返す「保証」が速いことを私が理解しているC++ 11でこれは変更されますか?
長いバージョン:
std::vector を含む小さなラッパー クラスがあります。
次のような特定の関数からこのクラスのインスタンスを返したいと思います。
メンバー ベクトルを返す方法と、std::vector を返すのが依然として悪い設計パターンであるかどうかについて、多くの情報を見つけました (ほとんどの状況では問題ないようです)。ただし、より大きなオブジェクトのメンバーであるベクトルを含むものはあまり見つかりませんでした。
同じアドバイスが当てはまりますか?戻り値の最適化を保証するために、コピー コンストラクターで何か特別なことをする必要がありますか?
この質問に対する答えは、C++ 標準のバージョンによって異なりますか?
c++ - コンパイラはいつ戻り値の最適化を行うことができますか
rvo(Return value optimizatio) に出会いました。正直なところ、rvo について 3 つの質問があります。
- コンパイラはどのような場合に rvo を実行する必要がありますか (標準準拠によると)?
- コンパイラが rvo を実行できないのはどのような場合ですか (標準準拠によると)?
- コンパイラが rvo を実行できないのはどのような場合ですか?
c++ - クラスメソッドからメンバーunique_ptrを返す
std::unique_ptr class
メンバーを呼び出し元に戻そうとしています(所有権を移動しようとしています)。以下は、サンプル コード スニペットです。
この場合、コンパイラ (gcc-5.2.1) は戻り値の最適化 (コピー省略) を行うことができると思いましたstd::move()
。しかし、そうではありません。なぜだめですか?
次のコードは正常に動作しているように見えますが、これは同等のようです。
c++ - (N)RVO は同じサイズのサブオブジェクト (メンバーまたはベース) に適用されますか?
RVO を使用すると、コピーのコストを発生させることなく、関数からローカル変数を返すことができます。これは、変数のサブオブジェクトを返すときにも機能しますか?
他の回答から、戻り値用に予約されたスペースに収まらないため、完全なオブジェクトのサイズが返されるオブジェクトよりも大きい場合はそうではありません。しかし、完全なオブジェクトが「空」である場合、つまりサイズがサブオブジェクトと同じ場合はどうでしょうか?
この質問をする私の根拠:
単純なオブジェクトがあるとします
そして、データのよりインテリジェントなビューとして機能するラッパー クラス:
これは、実装を容易にするために戻る一部の関数によって内部的に使用されData
ますが、インターフェイスはこれを反映しません (つまり、関数はラッパー自体を返しません)。だから私は関数を持っているかもしれません:
このユース ケースは私のラッパーでは一般的であるため、これをカプセル化するクラスに置き換えたいと考えています。つまり、 の最初の 2 行を、サブオブジェクトとラッパーの機能をmakeTheData
含む単一のローカル オブジェクトに置き換えます。Data
これは、ラッパーの一般的な使用例を実装するのに役立ちます。オブジェクトはContainingWrapper
オブジェクトと同じサイズであるData
ため、RVO は技術的に可能であるはずです。
RVO のパフォーマンス (これは非常に重要です) を失うことなく、この機能を (メンバーまたは基本サブオブジェクトを使用して、あるいは別の手段で) 実現できますか? as ifルールが適用され、RVO が可能になるように、オプティマイザが の 2 番目の実装を最初makeTheData
の実装に変更できるようになりますか?