問題タブ [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.

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

c++ - c++ がローカル std::stringstream を返すときに RVO を使用しないのはなぜですか?

C++ >= 11 で右辺値とローカル変数を返すことに関する多くの情報を読みました。あなたのために」。

わかりました、私はそれが起こることを望みます:

私はいいものを手に入れます

エラー。わかりません。なぜコピー コンストラクターを試行するのでしょうか。ここでC++ 11のすべての優れた機能を備えたムーブコンストラクターを使用しないでください。「--std=c++14」を使用しています。

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

c++ - 新しい変数を導入すると、値の最適化が無効になりますか?

我々はすべてそれを知っている

Foo戻り値の最適化を使用してコンパイルされるため、コピー コンストラクターに副作用があっても値のコピーは取得されません。しかし、

それも?2 番目の構文は、デバッグ時に役立ちます。しかし、そうすることで重要な最適化を捨てているのでしょうか? おそらく、明示的な移動コンストラクターを作成する必要がありますか?

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

c++ - コピー コンストラクターの使用を強制する / コピー コンストラクターの使用を避ける

現在、ロギング クラスを作成していて (練習用に)、問題が発生しました。私は 2 つのクラスを持っています: クラス Buffer は一時バッファとして機能し、そのデストラクタで自身をフラッシュします。また、Buffer インスタンスを返すクラス Proxy があるため、常に Buffer() を記述する必要はありません。

とにかく、ここにコードがあります:

出力は次のとおりです。

コードはまさに私が望むものですが、RVO に依存しています。RVO に頼るべきではないということを何度も読んだので、どうすればよいかお尋ねしたいと思います。

  1. 毎回コピー コンストラクターが呼び出されるように、RVO を完全に回避します。
  2. コピーコンストラクターを避ける

私はすでに参照を返すか移動することでコピーコンストラクターを回避しようとしましたが、それはセグメンテーション違反です。これは、 Proxy::operator<< の一時的なものが復帰時に削除されるためだと思います。

また、ほぼ同じことを行うまったく異なるアプローチにも興味があります。

0 投票する
3 に答える
235 参照

c++ - 移動コンストラクターの実装は戻り値の最適化にどのように影響しますか?

次のコード スニペットを検討してください。

g++andで問題なくコンパイルされclang++、出力は次のとおりです

その場合、RVOがキックするようです。移動コンストラクターが呼び出されていないことに注意してください。

ただし、使用されていないムーブ コンストラクターを上記のコードから削除すると、スニペットは次のようになります。

クラスのコピーコンストラクターが削除済みとしてマークされているため、両方ともこれをコンパイルすることclang++を拒否しているため、RVO は発生していないようです。g++A

使用されていない移動コンストラクターを削除すると、どのようにこれが発生する可能性がありますか?

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

c++ - C++ 戻り値の最適化、名前のない複数の戻り値

これら2つの関数を考えてみましょう:

これらの各関数が RVO に関して実際にどのように動作するかは、もちろんコンパイラに依存します。しかし、両方の RVO が一般的であると仮定するのは正しいでしょうか?


ps(回答を参照)関数#1は次のようになることを意図していました:

0 投票する
2 に答える
150 参照

c++ - このコードで RVO を適用しない理由

RVO のメッセージを出力するコンストラクタを持つ Complex クラスがあります。
Complex の operator+ メソッドを gtest でテストしました。
RVO が発生した場合、"Complex!!" を出力します。3回のメッセージ。
でも「コンプレックス!!」があります。5回のメッセージ。
RVOは発生していないと思います。
このコードを c++98 および c++11 でコンパイルしました
が、RVO が発生しないのはなぜですか?

0 投票する
2 に答える
7243 参照

c++ - C++17 での移動不可能な型と保証された RVO を持つ複数の戻り値 (構造化バインディング)

std::mutexC++ 17 では、保証された戻り値の最適化 (RVO) と考えられるものを介して、などの移動不可能 (コピー不可能を含む) 型を返す可能性があります。単純化された値カテゴリによる保証されたコピー省略:

また、構造化されたバインディングを使用して、次を許可します。

または(ここでも、コンストラクターの機能テンプレート引数推定に関する私の理解を使用しています)

しかし、これらの機能は、このようなことを可能にするために構成されていますか?

std::tuple私の考えでは、これが機能するには、 orの形成時に集約コンストラクター引数の保証された RVO が必要ですが、それmanyは P0144R2 提案に特に含まれていない RVO (NRVO) という名前ではないでしょうか?


補足: P0144R2 は、移動のみのタイプがサポートされていることを具体的に述べています。

2.6 移動専用型

移動のみのタイプがサポートされています。例えば: