質問

私は多分愚かな質問をしているかもしれませんが、私はRVOのウィキペディアのページを見ました ここ そして、その行動が間違っているかどうか疑問に思うのを止めることができませんでした。私は自分のマシンでそれを試しました、そして、最適化レベルにもかかわらず、RVOは完全にキックされています。実際に何かがあったらどうなりますか 大きい コンストラクターで起こりますか?私はそれがすべきではないことを知っていますが、もしそうなら?コンストラクターに副作用がある場合、なぜRVOが発生するのか理解できません。

編集: -fno-elide-constructors RVOを止めるようです。しかし、質問は残っています。

edit2:もっと深刻なことに、このようなことを知っている人は何人ですか?それはたぶん標準であるかもしれませんが、それは私が見るように本当に醜い機能です。少なくともコンパイラはデフォルトでそれを無効にし、これを知っている人にスイッチを提供する必要があります。 :)

編集3:私はまだこれが本当に悪いと主張しています。 :)。言語の構文に直接対抗するこのような他の言語の制約を知っているとは思わない。他のすべてがコンパイラまたはリンカーのエラーをスローしますか?

役に立ちましたか?

解決

標準は、プログラムの懸念を伴う運用を義務付けています 観察可能な状態 最適化してはならない、 コピー構築を除きます 特定の状況で。副作用が期待されている場合でも、実行するコピーコンストラクターに頼ってはなりません(たとえば、コンソール出力)。

他のヒント

他の回答で述べたように、コンパイラは、些細なコピーコンストラクターや割り当てオペレーターでさえも最適化できます。

12.8.15

特定の基準が満たされている場合、実装はクラスオブジェクトのコピー構築を省略することが許可されています。 オブジェクトのコピーコンストラクターおよび/またはデストラクタに副作用がある場合でも. 。そのような場合、実装は、省略されたコピー操作のソースとターゲットを同じオブジェクトを参照する2つの異なる方法として扱い、そのオブジェクトの破壊は、2つのオブジェクトが破壊されなかった時代の後半に発生します。最適化。このコピー操作の排除は、次の状況で許可されています(複数のコピーを削除するために組み合わせることができます)。

- クラスリターンタイプの関数の返品ステートメントでは、式が関数リターンタイプと同じCV不在型タイプを持つ不揮発性自動オブジェクトの名前である場合、自動を構築することでコピー操作を省略できます関数の戻り値に直接オブジェクトします

- 参照にバインドされていない一時的なクラスオブジェクト(12.2)が同じCV不在型のクラスオブジェクトにコピーされる場合、コピー操作は、一時オブジェクトを省略のターゲットに直接構築することで省略できます。コピー

「間違った」を定義します。 C ++言語は、観察可能であるにもかかわらず、この種の最適化を明示的に許可します。プログラムの動作が特定の実装に依存している場合、残念ながらISO C ++ではなく、方言を使用しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top