9

C++11の右辺値参照と、コードで最適なパフォーマンスを得るためにそれらを使用する方法を理解しようとしています。

A動的に割り当てられた大量のデータへのメンバー ポインターを持つクラスがあるとします。

さらに、foo(const A& a)class のオブジェクトで何かを行うメソッドA

のオブジェクトがfunction に渡されたときに、 のコピー コンストラクターAが呼び出されないようにしたいと考えています。その場合、基になるヒープ データのディープ コピーが実行されるためです。Afoo

左辺値参照を渡すことをテストしました:

    A a;
    foo(a);

そして右辺値参照を渡します:

    foo(A());

どちらの場合も、コピー コンストラクターは呼び出されませんでした。

これは予想どおりですか、それともコンパイラ (Apple LLVM 5.1) の最適化によるものですか? これに関する仕様はありますか?

4

1 に答える 1

21

それが予想されます。参照型パラメーター (左辺値または右辺値参照) に引数を渡すと、オブジェクトはコピーされません。それが参照の全体的なポイントです。

あなたが抱えている混乱はかなり一般的です。コピー コンストラクターまたはムーブ コンストラクターの選択は、オブジェクトを値渡しする場合にのみ発生します。例えば:

void foo(A a);

この関数にオブジェクトを渡すときA、コンパイラは、渡す式が左辺値式か右辺値式かによって、コピー コンストラクターとムーブ コンストラクターのどちらを使用するかを決定します。

一方、オブジェクトが構築されていないため、次の関数のいずれもコピーまたは移動コンストラクターを呼び出そうとしません。

void foo(A& a);
void foo(const A& a);
void foo(A&& a);
void foo(const A&& a);

ムーブ コンストラクター/代入演算子以外に、右辺値参照を受け取る関数を作成する理由が (あるとしても) めったにないことに注意することが重要です。値渡しとconst左辺値参照渡しのどちらかを決定する必要があります。

  1. とにかく関数内でオブジェクトのコピーが必要な場合 (おそらく、コピーを変更したり、別の関数に渡したりするため)、値で取得します ( A)。このように、左辺値が与えられた場合はコピーする必要があります (これを避けることはできません) が、右辺値が与えられた場合は最適に関数に移動されます。

  2. オブジェクトのコピーが必要ない場合は、const左辺値参照 ( const A&) で取得します。このようにすると、左辺値または右辺値のどちらを指定しても、コピーは行われません。ただし、移動セマンティクスを利用できなくなるため、コピーする必要がある場合はこれを使用しないでください。

音からすると、コピーをまったく作成しないので、const A&パラメーターが機能します。

于 2014-07-18T15:05:01.813 に答える