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

c++ - 戻り値による戻り値へのconst参照の使用

次の例を見てください。

私はRVOとNRVOを知っていますが、それを行うには、次のようにバーを書く必要があると思いました。

どちらのバージョンも機能しているようで、同じパフォーマンスであると思います。最初のバージョン(const参照付き)を使用しても安全ですか?

ありがとう。

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

c++ - どの関数構造が優れていますか?

次のコードを見てください。

関数f2は、オブジェクトを返す通常の形式です。NRVOが適用される可能性があり、追加のコピーコンストラクター呼び出しを回避できます。f1右辺値参照を使用する新しいフォームです。NRVOをサポートしていないが右辺値参照をサポートしているシステムの場合、コピーコンストラクターではなく、移動コンストラクターが呼び出されます。これは、ほとんどの場合に適していると見なされます。

問題はf1次のとおりです。この場合、NRVOをサポートするコンパイラはありますか?やっぱり将来的にはもっといい形になりそうです。

0 投票する
5 に答える
154 参照

c++ - スコープの導入中にコピー c-tor への余分な呼び出しを取得する

元のコード

出力は0、名前付き戻り値の最適化をサポートする最適化されたコンパイラで行われます。

の定義を変更するfoo

出力として取得1します。つまり、コピー c-tor が 1 回呼び出されます。考えられる理由は何ですか?ダミー スコープを導入すると、コードの動作が完全に変わります。私は何が欠けていますか?

g++ コンパイラでテストしました。実装固有の方法でシナリオを説明できるコンパイラ担当者はいますか?

編集

clang でテストしたところ、2 番目のケースでもコピー c-tor の呼び出しが最適化されました。

Andrew Pinski (gcc 担当者) は、これが実際に g++ の最適化を逃したケースであることを確認しました。

0 投票する
6 に答える
2069 参照

c++ - 戻り値の最適化 - C++ - デストラクタ呼び出し

次のコードは、デストラクタを 4 回呼び出します。

出力:

誰か説明してもらえますか?デストラクタの呼び出しは 3 つだけにすべきだと考えていました。

0 投票する
6 に答える
430 参照

c++ - RVO/NRVO の起動時にオブジェクトがコピーされるかどうか。

RVO (および NRVO) の定義について理解できません。これは、RVO がコピー コンストラクターを省略していると仮定して、このような質問が複数あるためです。12.8.15によると

このような場合、実装は、省略されたコピー操作のソースとターゲットを、同じオブジェクトを参照する 2 つの異なる方法として扱い、そのオブジェクトの破棄は、2 つのオブジェクトが削除されなかった場合に発生します。最適化。

コピー コンストラクターの呼び出しが省略されているのではなく、コピー自体が省略されているように見えます。最初にオブジェクトが「コピー」の場所に構築されるだけなので、「元の」オブジェクトはなく、コピーもまったくありません。したがって、クラスにprivateコピー コンストラクターがある場合でも、コピーがないため、RVO が開始されたときに関数から返される可能性があります。

私はそれを正しく理解していますか?コピー自体が省略されているか、コピーコンストラクタの呼び出しが省略されていますか? オブジェクト クラスにプライベート コピー コンストラクターがある場合、関数からオブジェクトを返すことを許可する必要がありますか?

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

c++ - (N)RVOの完全な例

私は (N)RVO について読んでいて、1 つの完全なシナリオの説明が欲しいです。この質問が他の C++ 学習者のアイデアを明確にするのに役立つことを願っています。

次のシナリオを想定します。

C++11 の move-semantics はしばらく無視してください。

  • (N)RVO が実行されない場合、いくつのコンストラクター/代入/デストラクタが実行されますか? (それらが参照するオブジェクトを指摘してください)
  • (N)RVOを適用すると何が変わる?
  • std::string最後に、移動セマンティクスをサポートするC++11 で状況がどのように変化するかを説明します。
0 投票する
4 に答える
1312 参照

c++ - std :: pairを返すときにRVOは発生しますか?

関数は、呼び出し元に2つの値を返す必要があります。実装するための最良の方法は何ですか?

オプション1:

オプション1.1:

オプション2:

Option2では、コピー/移動はありませんが、見た目は醜いです。Option1、1.1でコピー/移動は発生しますか?UとVがコピー/移動操作の両方をサポートする巨大なオブジェクトであると仮定しましょう。

Q:標準に従ってRVO / NRVOの最適化を理論的に行うことは可能ですか?はいの場合、gccまたは他のコンパイラはまだ実装されていますか?

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

c++ - msvcで戻り値の最適化を強制する方法

クラスに関数があり、デバッグモードでもコンパイラにNRVOを常に使用させたいと思っています。このためのプラグマはありますか?

これが「リリース」モードでうまく機能する私のクラスです。

このクラスは、_cbStackバイトを超える必要がない限り、スタック上にバッファーを作成するために使用されます。次に、破壊するときに、割り当てられている場合はメモリを解放します。文字列バッファを必要とするc関数とインターフェイスするときに便利であり、最大サイズがわからない場合に便利です。

とにかく、私はこのテストのように、CBufferを返すことができる関数を書き込もうとしていました。

私はfoo()を高速にするためにNRVOを頼りにしていました。リリースモードでは、うまく機能します。デバッグモードでは、クラスにコピーコンストラクターがないため、明らかに失敗します。CBufferは、すべてを50回コピーしたい開発者によって使用されるため、コピーコンストラクターは必要ありません。(Rant:これらの人は動的配列クラスを使用してWideCharToMultiByte()に渡す20文字のバッファーを作成していました。スタックに文字の配列を割り当てることができることを忘れているようです。彼らはスタックが何であるかさえ知っています...)

コードがデバッグモードで動作するように、コピーコンストラクターをコーディングしたくありません。それは巨大で複雑になります:

このプラグマは機能しません:

何か案は?

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

c++ - C ++コンパイラはconstの戻り値に対してRVOを実行できますか?

私が機能を持っているとしましょう

とのタイプが-nessの違いのためにの戻りタイプとは異なるt場合でも、コンパイラはの(名前付き)戻り値の最適化を実行できますか?stfooconst

(C++03とC++11で答えが異なる場合は、C ++ 03の答えを知ることに間違いなく興味があります。)

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

c++ - 次のコードがコピーコンストラクターも呼び出すのはなぜですか?

g_Fun()実行時にreturn tempコピーコンストラクターが呼び出されるのはなぜですか?