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 回答