問題タブ [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 投票する
0 に答える
117 参照

c++ - (N)RVO は同じサイズのサブオブジェクト (メンバーまたはベース) に適用されますか?

RVO を使用すると、コピーのコストを発生させることなく、関数からローカル変数を返すことができます。これは、変数のサブオブジェクトを返すときにも機能しますか?

他の回答から、戻り値用に予約されたスペースに収まらないため、完全なオブジェクトのサイズが返されるオブジェクトよりも大きい場合はそうではありません。しかし、完全なオブジェクトが「空」である場合、つまりサイズがサブオブジェクトと同じ場合はどうでしょうか?


この質問をする私の根拠:

単純なオブジェクトがあるとします

そして、データのよりインテリジェントなビューとして機能するラッパー クラス:

これは、実装を容易にするために戻る一部の関数によって内部的に使用されDataますが、インターフェイスはこれを反映しません (つまり、関数はラッパー自体を返しません)。だから私は関数を持っているかもしれません:

このユース ケースは私のラッパーでは一般的であるため、これをカプセル化するクラスに置き換えたいと考えています。つまり、 の最初の 2 行を、サブオブジェクトとラッパーの機能をmakeTheData含む単一のローカル オブジェクトに置き換えます。Data

これは、ラッパーの一般的な使用例を実装するのに役立ちます。オブジェクトはContainingWrapperオブジェクトと同じサイズであるDataため、RVO は技術的に可能であるはずです。

RVO のパフォーマンス (これは非常に重要です) を失うことなく、この機能を (メンバーまたは基本サブオブジェクトを使用して、あるいは別の手段で) 実現できますか? as ifルールが適用され、RVO が可能になるように、オプティマイザが の 2 番目の実装を最初makeTheDataの実装に変更できるようになりますか?

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

c++ - コピー コンストラクターがないと NRVO が機能しない理由

私は本Inside C++ Object Modelを読んでいて、以下のものを手に入れました:
ここに画像の説明を入力

私が知っているように、NRVO は関数が返すクラスのコピー コンストラクターを呼び出しません。そのため、「コピー コンストラクターがないため、プログラムのこの最初のバージョンでは NRV 最適化が適用されない... "。