問題タブ [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++ - c++ がローカル std::stringstream を返すときに RVO を使用しないのはなぜですか?
C++ >= 11 で右辺値とローカル変数を返すことに関する多くの情報を読みました。あなたのために」。
わかりました、私はそれが起こることを望みます:
私はいいものを手に入れます
エラー。わかりません。なぜコピー コンストラクターを試行するのでしょうか。ここでC++ 11のすべての優れた機能を備えたムーブコンストラクターを使用しないでください。「--std=c++14」を使用しています。
c++ - 新しい変数を導入すると、値の最適化が無効になりますか?
我々はすべてそれを知っている
Foo戻り値の最適化を使用してコンパイルされるため、コピー コンストラクターに副作用があっても値のコピーは取得されません。しかし、
それも?2 番目の構文は、デバッグ時に役立ちます。しかし、そうすることで重要な最適化を捨てているのでしょうか? おそらく、明示的な移動コンストラクターを作成する必要がありますか?
c++ - コピー コンストラクターの使用を強制する / コピー コンストラクターの使用を避ける
現在、ロギング クラスを作成していて (練習用に)、問題が発生しました。私は 2 つのクラスを持っています: クラス Buffer は一時バッファとして機能し、そのデストラクタで自身をフラッシュします。また、Buffer インスタンスを返すクラス Proxy があるため、常に Buffer() を記述する必要はありません。
とにかく、ここにコードがあります:
出力は次のとおりです。
コードはまさに私が望むものですが、RVO に依存しています。RVO に頼るべきではないということを何度も読んだので、どうすればよいかお尋ねしたいと思います。
- 毎回コピー コンストラクターが呼び出されるように、RVO を完全に回避します。
- コピーコンストラクターを避ける
私はすでに参照を返すか移動することでコピーコンストラクターを回避しようとしましたが、それはセグメンテーション違反です。これは、 Proxy::operator<< の一時的なものが復帰時に削除されるためだと思います。
また、ほぼ同じことを行うまったく異なるアプローチにも興味があります。
c++ - 移動コンストラクターの実装は戻り値の最適化にどのように影響しますか?
次のコード スニペットを検討してください。
g++andで問題なくコンパイルされclang++、出力は次のとおりです
その場合、RVOがキックするようです。移動コンストラクターが呼び出されていないことに注意してください。
ただし、使用されていないムーブ コンストラクターを上記のコードから削除すると、スニペットは次のようになります。
クラスのコピーコンストラクターが削除済みとしてマークされているため、両方ともこれをコンパイルすることclang++を拒否しているため、RVO は発生していないようです。g++A
使用されていない移動コンストラクターを削除すると、どのようにこれが発生する可能性がありますか?
c++ - C++ 戻り値の最適化、名前のない複数の戻り値
これら2つの関数を考えてみましょう:
と
これらの各関数が RVO に関して実際にどのように動作するかは、もちろんコンパイラに依存します。しかし、両方の RVO が一般的であると仮定するのは正しいでしょうか?
ps(回答を参照)関数#1は次のようになることを意図していました:
c++ - このコードで RVO を適用しない理由
RVO のメッセージを出力するコンストラクタを持つ Complex クラスがあります。
Complex の operator+ メソッドを gtest でテストしました。
RVO が発生した場合、"Complex!!" を出力します。3回のメッセージ。
でも「コンプレックス!!」があります。5回のメッセージ。
RVOは発生していないと思います。
このコードを c++98 および c++11 でコンパイルしました
が、RVO が発生しないのはなぜですか?
c++ - C++17 での移動不可能な型と保証された RVO を持つ複数の戻り値 (構造化バインディング)
std::mutexC++ 17 では、保証された戻り値の最適化 (RVO) と考えられるものを介して、などの移動不可能 (コピー不可能を含む) 型を返す可能性があります。単純化された値カテゴリによる保証されたコピー省略:
また、構造化されたバインディングを使用して、次を許可します。
または(ここでも、コンストラクターの機能テンプレート引数推定に関する私の理解を使用しています)
しかし、これらの機能は、このようなことを可能にするために構成されていますか?
std::tuple私の考えでは、これが機能するには、 orの形成時に集約コンストラクター引数の保証された RVO が必要ですが、それmanyは P0144R2 提案に特に含まれていない RVO (NRVO) という名前ではないでしょうか?
補足: P0144R2 は、移動のみのタイプがサポートされていることを具体的に述べています。
2.6 移動専用型
移動のみのタイプがサポートされています。例えば: