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

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

次の例を見てください。

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

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

ありがとう。

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

c++ - C++統一代入演算子move-semantics

編集:解決済みコメントを参照-回答なしで解決済みとしてマークする方法がわからない。

c ++ 0xでのパーフェクトフォワーディング/移動セマンティクスに関するチャンネル9のビデオを見た後、私はこれが新しい代入演算子を書くための良い方法であると信じるようになりました。

これにより、r値と定数の両方を割り当てることができます。適切なコンストラクターを使用して新しいオブジェクトを作成し、その内容を*thisと交換します。必要以上にデータがコピーされないので、これは私には聞こえます。そして、ポインタ演算は安価です。

しかし、私のコンパイラは同意しません。(g ++ 4.6)そして私はこれらのエラーを受け取ります。

私は何か間違ったことをしていますか?これは悪い習慣ですか(自分で割り当てているかどうかをテストする方法はないと思います)?コンパイラはまだ準備ができていませんか?

ありがとう

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

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

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

出力:

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

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

c++ - ここでg++がRVOを有効にしないのはなぜですか?

そのテストコードを検討してください。

コンパイル:

出力は次のとおりです。

関数の戻り値とパラメーターのコピーを回避するために、コンパイラーがすべてのCOPYCTOR呼び出しを削除するためにRVOメカニズムを使用することを期待していましたcreate()。なぜそうではないのですか?

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

c++ - パラメータを返すときにRVOが許可されないのはなぜですか?

[C ++ 11:12.8 / 31]に記載されています:

コピーの省略と呼ばれるこのコピー/移動操作の省略は許可されています[...]:

—クラスreturn型を持つ関数のreturnステートメントで、式が、関数return型と同じcv-unqualified型を持つ不揮発性自動オブジェクト(関数またはcatch-clauseパラメーター以外)の名前である場合、自動オブジェクトを関数の戻り値に直接構築することにより、コピー/移動操作を省略できます。

これは、

印刷します

2番目のコピーコンストラクタが必要なのはなぜですか?コンパイラは単にxの寿命を延ばすことはできませんか?

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

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

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

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

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

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

0 投票する
4 に答える
1107 参照

c++ - コピーコンストラクターがプライベートで実装されていない場合、RVOは許可されますか?

コピーコンストラクターがプライベートで実装されていないクラスがあるとします(オブジェクトをコピー不可にするため)

同じクラスのいくつかのメンバー関数で、そのクラスのオブジェクトを返すコードを記述します。

これは、RVOが開始できる場合です。

RVOでは、コピーコンストラクターにアクセスできる必要があります。コピーコンストラクターへの可能な呼び出しは同じクラスメンバー関数内から行われるため、コピーコンストラクターにアクセスできます。したがって、コピーコンストラクターの使用を禁止することが目的であったにもかかわらず、技術的にはRVOが可能です。

そのような場合、RVOは許可されますか?

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

c++ - 大きなベクトルの戻り値の最適化と auto_ptr

大きなベクトルを設定する関数の戻り値として auto_ptr を使用すると、関数がソース関数になります (内部の auto_ptr が作成され、const 以外の auto_ptr を返すときに所有権が渡されます)。ただし、データにアクセスするには auto_ptr を逆参照する必要があるため、この関数を STL アルゴリズムで使用することはできません。私が推測する良い例は、各ベクトルが 100 個のコンポーネントを持つサイズ N のベクトルのフィールドでしょう。N が大きい場合、関数が各 100 成分ベクトルを値または ref で返すかどうかは同じではありません。

また、この非常に基本的なコードを試すと、次のようになります。

autoFun と fun 呼び出しの両方が出力されます

Ctor Dtor

そのため、return ステートメントに渡されるように作成されている自動変数を実際に見ることはできません。これは、valueFun 呼び出しに対して戻り値の最適化が設定されているということですか? この場合、valueFun は 2 つの自動オブジェクトを作成しますか?

このような大規模なデータ構造の母集団を関数で最適化するにはどうすればよいでしょうか?

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

c++ - オブジェクトのコピーを返す C++

次のコードを書きました。

プログラムのある時点で、メソッドを使用しようとし、取得したオブジェクトに対してメソッドgetMyObjectのみを使用します。const

  • さて、コンパイラがこのコードを最適化して、コピーstd::vector<int>が行われないようにすることは可能でしょうか?

    コンパイラーがconst、取得したオブジェクトのメソッドのみを使用していると判断し (その背後でナンセンスが発生していないと仮定しましょうmutable) 、オブジェクトのコピーを作成せず、これらのconst操作をprivateメンバーに対して実行する可能性はありますか?MyObjectHolder代わりに?

  • const std::vector<int> myObjectはいの場合、 as を明示的に宣言しなければ可能でしょうconstか?

  • いいえの場合、これを行わない理由は何ですか? どのような場合に、この最適化を実装するのが難しいか、可能であると推測し、ここで修正するかなど...?

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

c++ - const 参照による引数の受け渡しではなく、いつコピー省略を選択する必要がありますか?

重複の可能性:
値渡しは C++11 の妥当なデフォルトですか?

私はスピードが欲しいを読んでいますか?値渡し。コピー省略と RVO についての Dave Abrahams による。そして、なぜコピー省略が必要なのだろうか?

コピーを避けるために、関数の引数を const 参照で渡す必要があると何度も言われました (私が読んだほぼすべての C++ 本で、これについて教えてもらいました)。

2 つの関数があるとします。

実引数が右辺値の場合、両方の関数でコピーが回避されます。しかし、実際の引数が左辺値の場合、コピーは f2 ではなく f1 でのみ回避されます。では、なぜこの機能が必要なのでしょうか?