vector.push_back rvalue和copy-elision

时间:2012-08-09 02:25:15

标签: c++ vector copy-elision

push_backvector临时对象转换为vector<A> vec; vec.push_back(A("abc"));

A("abc")

编译器是否应用copy-elision将临时vector直接构造到A中,以便在将临时对象推入vec时不会触发{{1}}的复制ctor {{1}}。

2 个答案:

答案 0 :(得分:6)

如果您有一个支持右值引用的编译器,它将被移动到向量中,这有时非常便宜。

另一种方法是直接在向量中构造对象,可以使用vec.emplace_back("abc");来完成。这只会调用一个构造函数。

这两个都是C ++ 11的功能。这里不允许复制省略,因此如果没有这些功能,仍然会制作副本。

但是,如果复制构造函数没有可观察到的副作用(它不应该有它),智能编译器仍然可以执行该优化,因为“as-if”规则允许任何导致相同的优化可观察的行为。不过,我不知道当前的编译器是否会这样做。如果没有,我怀疑任何人都会花费精力来添加这样的优化,因为右值引用会结束这种需求。

答案 1 :(得分:2)

在一般情况下,它无法完成,它可能在这里完成,因为vector是一个模板,代码可能是内联的,为优化器提供更多信息来完成它的工作并减轻一些函数调用的要求。

在一般情况下,复制省略通过将两个对象放在内存中的相同位置并且只有两个名称来引用单个对象来工作。在这种情况下的问题是其中一个参数必须位于向量内(动态分配,在特定位置),另一个是函数的参数,可能由调用约定绑定到特定位置在堆栈中。如果是这种情况,则编译器将无法优化副本。