7

コピーの省略は優れた最適化手法であり、場合によっては、コピーの省略に依存する方が、参照を「手動で」渡すよりも実際に高速になることがあります。

したがって、最大のパフォーマンスを得るために、コードパスに対してコンパイラによってコピーの省略が実行されるという事実に依存する重要なコードパスを特定したと仮定します。

しかし今、あなたはコンパイラの最適化に依存しています。

コピーの省略が実際に実行され、コピーの省略が実行できない場合にコンパイラ(または別のツール)に警告/エラーを生成させる(コンパイラ固有の、明らかに)方法はありますか?

__forceinline(このようにマークされた関数がコンパイラーによってインライン化されていない場合に警告を生成するよりも、Visual C ++にリモートで類似したものを考えています。)

4

3 に答える 3

4

いいえ。

しかし、完全に読めないものの、同等のコードを書くことができます。

BigObj f()
{
    BigObj x(g());
    x.someMethod();
    return x;
}

//...
BigObj z = f();
//...

(コピーの省略を使用して)次のように翻訳されます。

void f(BigObj* obj)
{
    new(obj) BigObj(g());
    obj->someMethod();
}

//...
char z[sizeof(BigObj)];
f((BigObj*)&z[0]);
//...
((BigObj*)&z[0])->~BigObj();

しかし、真剣に、コンパイラがコピーを削除できるような方法でコードを書くだけです。つまり、分岐せずに1つのオブジェクトのみを返します。

BigObj f()
{
    BigObj x, y;
    // use x and y
    if(condition)
        return x;
    else
        return y;
    // cannot be elided
}


BigObj f()
{
    if(condition)
    {
        BigObj x;
        return x;
    }
    else
    {
        BigObj y;
        return y;
    }
    // can be elided
}
于 2011-05-26T14:57:26.230 に答える
4

assert(false);コピーコンストラクターにを入れることを除いて、実際にはそうではありません。

それ以外の場合は、お気に入りのプロファイラーを使用して、アプリの興味深い部分が十分に高速であることを測定します。

于 2011-05-26T14:59:07.913 に答える
2

C ++ 1z(2017年に予定)では、コピーの省略を保証するためにいくつかのケースが必要になります。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html

共同のcppreference.comコンパイラ機能サポートwikiGCC7 +およびClang4+に従って、これを確認してください。

幸いなことに、これの最適化の側面では、純粋な最適化(古い言語の標準許容値に従う)であるため、新しい言語のサポートを有効にする必要はありません。

また、最適化が適用されるときにコピーコンストラクターを使用できないようにするには、コンパイル中に新しい言語標準を有効にするか、厳密な準拠を必要としないルーズモードまたは拡張モード(GCCなど-fpermissive)を使用する必要があります。

于 2016-06-27T13:23:08.997 に答える