問題タブ [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++ - コンストラクターのない標準的なレイアウト構造体を持つ RVO
バイナリ メッセージを表す構造体があります。バッファから次のそのようなレコードを取得する関数を書きたい (ファイルかソケットかは関係ありません):
今、私はこれを次のように書くことができます:
これは素晴らしいことであり、RVO の利点を私に与えてくれます。ただし、のデフォルト コンストラクターがRecord
呼び出されます。これは、回避したい機能を実行する非自明なデフォルト コンストラクターを持つ型で構成されている可能性があります。これらは必ずしも POD 型ではありませんが、標準レイアウトです。
getNext()
コンストラクター (デフォルトまたはコピー/移動) を回避するように記述する方法はありますRecord
か? 理想的には、ユーザーが呼び出すとき:
バッファは のメモリに直接読み込まれますrecord
。これは可能ですか?
c++ - ローカル オブジェクトのメンバーを返す方法
次のコードを検討してください。
getBigData()
コピー省略/移動セマンティクスに関して実装する最良の方法は何ですか? この実装では、コンパイラは移動できないようbigData
です。次の機能をテストしました。
これらの実装の結果を説明し、ローカル オブジェクトのメンバーを返す最も効果的な方法を示してください。
c++ - RVO は "new" で動作しますか?
この状況でコピー省略が発生しますか? 言い換えれば、コピー省略を使用する最新のコンパイラは、ここでコピー コンストラクターを呼び出すことを回避しますか?
オブジェクトをポインターに格納することを目指しています。オブジェクトは関数によって返されます。コピーせずに保存したい。
C++11が使えない
c++ - const-overload と RVO のコード重複の回避
const-overload を扱うときにコードの重複を避けるために、次のように書きました。
const_cast
は非 const バージョンで使用されます。それ以外の場合は、const-method での非 const 関数呼び出しになり、おそらくオブジェクトが変更され、気付かれずに回避されるためです ( const_cast
. また、非 const から const への const キャストは問題を引き起こさないはずです。
そして、ここでの質問は次のとおりです。オブジェクトを const_cast できないため、呼び出されたlightCopy()
オブジェクトが const オブジェクトを返し、実際の戻り値の型が const ではないため、RVO は不可能であり、追加のコピーが作成される可能性はありますか?
c++ - ラムダ式と RVO
「戻り値の最適化」の概念は C++ コンパイラのラムダ式に適用されますか? コンパイラと最適化パラメータに依存することは知っていますが、理論的には可能ですか?
ところで、VS.NET 2013以降でこの問題について知っている人はいますか?
c++ - (N)RVO は、値が既存のオブジェクトにコピーされているときにも発生しますか?
(N)RVO は、戻り値が新しい変数に代入されるときに一時オブジェクトの不要なコピーと作成を回避するのに役立ちます (したがって、コピー コンストラクターを回避します)。
したがって、次のようなものは RVO で最適化する必要があります。
しかし、呼び出しサイト オブジェクトが既に存在する場合にも発生しますか? (=
つまり、コピー コンストラクターの代わりに演算子が使用される場合)。私はこれに関する文献を見つけようとしましたが、(N)RVO は常にコピー コンストラクターを回避するという観点から説明されているようです。この場合、呼び出しサイト オブジェクトを変更しても実際に安全かどうかはわかりません。