問題タブ [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++ - g++: 複数の翻訳単位が関係している場合の RVO の仕組み
まず、2 つの翻訳単位で構成される次のコードを見てください。
foo.cpp と main.cpp が異なる翻訳単位であることを確認してください。したがって、私の理解では、翻訳ユニット main.o (main.cpp) で利用可能な getFoo() の実装の詳細はないと言えます。
しかし、上記をコンパイルして実行すると、RVO がここで動作していることを示す "Copy Ctor" 文字列が表示されませんでした。
「getFoo()」の実装の詳細が翻訳単位 main.o に公開されていなくても、これをどのように達成できるか教えていただければ幸いです。
GCC (g++) 4.4.6 を使用して上記の実験を行いました。
c++ - std :: pairを返すときにRVOは発生しますか?
関数は、呼び出し元に2つの値を返す必要があります。実装するための最良の方法は何ですか?
オプション1:
オプション1.1:
オプション2:
Option2では、コピー/移動はありませんが、見た目は醜いです。Option1、1.1でコピー/移動は発生しますか?UとVがコピー/移動操作の両方をサポートする巨大なオブジェクトであると仮定しましょう。
Q:標準に従ってRVO / NRVOの最適化を理論的に行うことは可能ですか?はいの場合、gccまたは他のコンパイラはまだ実装されていますか?
c++ - msvcで戻り値の最適化を強制する方法
クラスに関数があり、デバッグモードでもコンパイラにNRVOを常に使用させたいと思っています。このためのプラグマはありますか?
これが「リリース」モードでうまく機能する私のクラスです。
このクラスは、_cbStackバイトを超える必要がない限り、スタック上にバッファーを作成するために使用されます。次に、破壊するときに、割り当てられている場合はメモリを解放します。文字列バッファを必要とするc関数とインターフェイスするときに便利であり、最大サイズがわからない場合に便利です。
とにかく、私はこのテストのように、CBufferを返すことができる関数を書き込もうとしていました。
私はfoo()を高速にするためにNRVOを頼りにしていました。リリースモードでは、うまく機能します。デバッグモードでは、クラスにコピーコンストラクターがないため、明らかに失敗します。CBufferは、すべてを50回コピーしたい開発者によって使用されるため、コピーコンストラクターは必要ありません。(Rant:これらの人は動的配列クラスを使用してWideCharToMultiByte()に渡す20文字のバッファーを作成していました。スタックに文字の配列を割り当てることができることを忘れているようです。彼らはスタックが何であるかさえ知っています...)
コードがデバッグモードで動作するように、コピーコンストラクターをコーディングしたくありません。それは巨大で複雑になります:
このプラグマは機能しません:
何か案は?
c++ - 以下のコードでコピー コンストラクターがプライベートの場合にエラー C2248 が発生するのはなぜですか?
RVO はコピー コンストラクターを必要としませんが、このコードはerror C2248: 'A::A' : cannot access private member declared in class 'A'
VS2010 で生成されます。これを証明するには、A(const A&);
以下の宣言を public にするだけで、コピー コンストラクターの定義がなくても、コードは問題なく実行されます。
c++ - バックトラッキング中に出力パラメータを回避するにはどうすればよいですか?
私たちが知っているように、出力パラメータは本当に悪いことです
ここで、x は実際に期待されるパラメーターです。これは、Linux システム コールではかなり一般的な方法です。しかし、C++ の場合、これは適切なコーディング方法ではないようです。
文字列のリストのリストをバックトラックし、各リストから可能なすべての文字列の組み合わせを返す必要があるシナリオがあります。
簡単なバックトラッキング ソリューションは次のようになります。
ここで、出力リストを返すことができるように、ここで出力パラメーターを回避するにはどうすればよいですか?
c++ - 関数からの戻り値としてのコンストラクターの変換
進化した RVO がない場合でも、コピー コンストラクターではなく変換コンストラクターを使用して関数からオブジェクトを返すことは可能ですか (コンパイラーがそのような種類の最適化をサポートしていないとします)。質問のポイントは、C++ std が何を言っているのかということです。誰か教えてもらえますか? 私はgccを入手し、コメントにいくつかの質問をして以下のコードをコンパイルしました。