問題タブ [copy-elision]

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 投票する
2 に答える
171 参照

c++ - コピー省略と仮想クローニング

次のシナリオで不要なコピーを回避するにはどうすればよいですか? クラス A には、大きなオブジェクトへの基本型ポインターが含まれています。

オブジェクトobをコピーする必要がある場合があります。そこで、仮想クローニングを実装します。

しかし、一時的な BigDerivedClass オブジェクトを作成し、それを使用してクラス A を構築することがあります。

また

ここでは、作成したオブジェクトをコピーしてから削除する必要はありません。このオブジェクトをヒープに直接作成し、そのアドレスをa.ptrに保存することができます。

しかし、コンパイラがここでコピー省略を実装するのに十分スマートであるとは思えません (またはそうですか?)。では、そのような不必要なコピーを避けるために何を提案しますか?

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

c++ - コピーの省略を強制する方法、削除されたコピーコンストラクターで機能しないのはなぜですか?

コピーできないクラスがあります。これをコピーすると問題が発生します。コピーされないことを保証したいので、コピー コンストラクターを作成しましたdeleted

残念ながら、g++ は次の理由でこれをコンパイルしません。

しかし、これはコピー省略を使用すべき非常に明確な状況であるため、コピー コンストラクターを呼び出すべきではありません。なぜそうなのですか?

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

c++ - C++1zのリスト初期化で保証されたコピー省略はどのように機能しますか?

C++ ドラフト n4606 [dcl.init] 17.6 には、保証されたコピー省略に関する段落があります。

  • 宛先の型が (おそらく cv 修飾された) クラス型の場合:
    • 初期化式が prvalue であり、ソース型の cv 修飾されていないバージョンが宛先のクラスと同じクラスである場合、初期化式は宛先オブジェクトを初期化するために使用されます。[:デフォルトのコンストラクターをT x = T(T(T()));呼び出して初期化します。—終了例]Tx
    • [...]

操作方法についてのQ&Aもあります。

私が理解しているように、私が引用したルールは、イニシャライザ式が prvalue であり、ソース タイプの cv 非修飾バージョンが宛先のクラスと同じクラスである場合、ctor が関与しないことを保証します。そのため、コピーまたは移動 ctor の存在を確認する必要はありません。これにより、次のコードが C++17 で有効になります。

しかし、私を夢中にさせているのは、c++ ドラフト n4606 のリスト初期化セクションに同様のルールが見つからないことです。私が見つけたのは([dcl.init.list] 3.6)です

[...]

  • それ以外の場合、Tがクラス型の場合、コンストラクターが考慮されます。適用可能なコンストラクターが列挙され、オーバーロード解決 (13.3、13.3.1.7) によって最適なコンストラクターが選択されます。引数のいずれかを変換するために縮小変換 (以下を参照) が必要な場合、プログラムは不適切な形式です。[...]

リスト初期化は最初に引用したルールよりも優先度が高いため、初期化子が初期化リストの場合は、リスト初期化セクションのルールを考慮する必要があります。ご覧のとおり、コンストラクターは、クラス type をリスト初期化するときに考慮されますT。したがって、前の例に引き続き、

C ++ 17で合法ですか?そして、誰かがリストの初期化で保証されたコピー省略がどのように機能するかを標準ドラフトが指定している場所を見つけることができますか?

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

c++ - STLを使用してエリジョンをコピーします(例としてベクトル)

私はC ++のコピー省略について読んでいました。そして、このコピー省略を使用した C++ の STL について疑問を持っていました。

次のコード:

そのため、ベクトル A と B を単純なタスク (マージ) を行っていました (プロセスには注意を払わず、関数だけに注意して戻ります。

vector<int>次の定義では、 (参照なし)を返しています

またreturn result;、関数スコープで宣言された変数です。

これらのベクトルが配置されているメモリアドレスを確認しようとしていました。出力:

どちらもメモリアドレスが違うので、コピーコンストラクタにしない限り最後は同じメモリアドレス(0xffefffe40)になると思っていたのですが、コピー構築ということでしょうか?

このメソッドはコピー省略ですか?

  • そうでない場合:なぜコピー省略ではないのですか?
  • はいの場合: 本当にコピー省略を行っていることをどのように知ることができますか?

そして重要なことは、これがコピー省略ではない場合、それを行うことは可能ですか? STLでコピー省略を行うには何が必要ですか?

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

c++ - コピーする標準状態は同等でなければなりませんか?

基になるバッファーを所有しているか所有していない、奇妙な文字列型があるとします。

そのコピーコンストラクターはどこかで標準に違反していますか? 検討:

s追加のコピー コンストラクターが省略されたかどうかに応じて、所有または非所有のいずれかになります。これは、C++14 以前では許可されていましたが、省略可能です (C++17 では保証されています)。Schrödinger の所有権モデルは、このコピー コンストラクター自体が未定義の動作であることを示唆しています。

それは...ですか?


より具体的な例は次のとおりです。

どのコピーが省略されるかに応じて、x.iで返されたものよりも 0、1、または 2 増える可能性がありますgetX()。規格はこれについて何か言っていますか?