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

c++ - この場合、移動コンストラクターが呼び出されるのはなぜですか?

次のコードがあります。

SomeClass はコンストラクターに何かを記録するだけなので、何が呼び出されているかを確認できます。

リリースビルドでは、次の出力があります。

これは、コピー/移動の省略により理にかなっています。戻り値の最適化をオフにしたかったのです。デバッグビルドを使用すると、次の出力が得られます。

ここで、NRVO si を安全にオフにできると思います。コピー コンストラクターの代わりにムーブ コンストラクターが呼び出される理由が本当に不思議です。私の(おそらく間違っている)理解は、 func の someObject は左辺値であるため、戻りオブジェクトは移動コンストラクターではなくコピーコンストラクターを使用して初期化する必要があるということです。

私は何が欠けていますか?誰かがそのケースが解明されている標準の段落を指摘できますか?

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

gcc - 現代のC ++のoperator + =に関する対称operator +?

Boost.Operator https://www.boost.org/doc/libs/1_69_0/libs/utility/operators.htm#symmetryでの対称演算子の実装に関するこのメモを読んでいましたが、非常に時代遅れであると思われます。

operator+議論は、一貫性が利用可能な場合、一般的に実装するための最良の方法は何かについて展開しoperator+=ます。そこでの結論は、それは(だった)、

当時、一部のコンパイラは RVO ではなく NRVO をサポートしていたためです。

現在、NRVO が必須であり、あらゆる種類の最適化が実行されていますが、これはまだ当てはまりますか?

たとえば、特定のケースで現在意味のある他のバージョンは次のとおりです。

また

コンストラクター、移動コンストラクター、および合理的なクラスを持つクラスが与えられoperator+=ます。例えば:

対称を実装する最良の方法は何operator+ですか? ここに可能なコードのセットがあります

https://godbolt.org/z/2YPhcgで試してみましたが、組み立てラインの数を数えるだけで、他のすべての条件が同じであれば、何が最適な実装であるかがわかります。これらの混合結果が得られます。

while/*3*/とは、または/*4*/の形式の呼び出しの恩恵を受けることができます。sum(std::move(a), b)sum(sum(a, c), b)

T tmp(a); tmp+=b; return tmp;それでも実装する最良の方法はありますかoperator+(T [const&], T const&)

移動コンストラクターと移動 += がある場合、他の可能性があるように見えますが、clang でより単純なアセンブリを生成するように見えるだけです。