5

通常、これは大きな値のコピーを伴わないように最適化されます(astd::vectorは移動セマンティクスが有効になっているため)。

std::vector<int> makeABigThing(){
    std::vector<int> large_thing(1000, 0);
    return large_thing;
}

関数が仮想メソッドの場合、これも同じ方法で最適化できますか?

struct Foo{
    virtual std::vector<int> makeABigThing(){
        std::vector<int> large_thing(1000, 0);
        return large_thing;
    }
};

つまり、実行時に呼び出された関数が選択されている場合でも、移動セマンティクスは機能しますか?

4

3 に答える 3

7

関数が静的であるか動的に解決されるかは、結果を移動する可能性に影響しません。

于 2012-10-16T20:55:06.893 に答える
4

virtual何も変わらないのに比べて何も変わりません。コンパイラは、コンパイル時の戻り型を認識しています。実際、これは(ほぼ*)ベクトルの移動セマンティクスを使用することが保証されています。

*NRVOを介して完全に排除することができます

于 2012-10-16T20:56:23.270 に答える
0

この最適化はコピーの省略(http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/)と呼ばれ、c++11より前のものです。移動セマンティクスとコピーの省略はどちらも同じ種類のソリューションであり、どちらも標準の一部ですが、コピーの省略はコンパイラーによって実装され、移動セマンティクスはプログラマーによるこの最適化の制御を提供します。

動作は、仮想であるかどうかにかかわらず、同じである必要があります。

于 2012-10-16T21:01:33.163 に答える