9

https://web.archive.org/web/20120707045924/cpp-next.com/archive/2009/08/want-speed-pass-by-value/に出くわしました

著者のアドバイス:

関数の引数をコピーしないでください。代わりに、それらを値で渡し、コンパイラーにコピーさせます。

ただし、この記事に示されている 2 つの例でどのような利点が得られるかはよくわかりません。

// Don't
T& T::operator=(T const& x) // x is a reference to the source
{ 
    T tmp(x);          // copy construction of tmp does the hard work
    swap(*this, tmp);  // trade our resources for tmp's
    return *this;      // our (old) resources get destroyed with tmp 
}

// DO
T& operator=(T x)    // x is a copy of the source; hard work already done
{
    swap(*this, x);  // trade our resources for x's
    return *this;    // our (old) resources get destroyed with x
}

どちらの場合も、追加の変数が 1 つ作成されるため、メリットはどこにあるのでしょうか? 私が見る唯一の利点は、一時オブジェクトが2番目の例に渡された場合です。

4

1 に答える 1

8

ポイントは、オペレーターの呼び出し方によっては、コピーが省略される場合があるということです。次のように演算子を使用するとします。

extern T f();
...
T value;
value = f();

引数がT const&コンパイラによって取得された場合、一時的なものを保持し、参照を代入演算子に渡すしかありません。一方、引数を値で渡す場合、つまり を使用するT場合、 から返される値f()をこの引数の場所に配置できるため、コピーが 1 つ省略されます。代入の引数が何らかの形式の左辺値である場合、もちろん常にコピーする必要があります。

于 2013-09-16T09:54:56.630 に答える