5

次のことを考慮してください。

ComplexObject foo()
{
    ComplexObject temp;
    //Do things with temp
    ComplexObject result(temp, SOME_OTHER_SETTING); //1
    //Do things with result. Do not use temp at all
    return result; //2
}

ComplexObject foo()
{
    ComplexObject temp;
    //Do things with temp
    ComplexObject result(std::move(temp), SOME_OTHER_SETTING); //1
    //Do things with result. Do not use temp at all
    return std::move(result); //2
}

ComplexObjectには、コピーコンストラクターよりもはるかに効率的な移動コンストラクターがあることを前提としています。

コンパイラは、ComplexObjectをそのブロックの残りの部分に使用できないことを認識しているため、最初のコードを2番目のコードに効果的に変換できますか?

4

1 に答える 1

3

の場合ではありませんtempが、コンパイラーはas-ifルールの下で他の最適化を実行できますが、これは同じ効果をもたらす可能性があります。

についてresultは、ステートメントに関する特別なルールがあり、return可能であれば移動を使用します(移動またはコピーよりも省略が優先されます)。

于 2012-04-27T16:59:47.830 に答える