9

push_back一个临时对象变成了vector这样,

vector<A> vec;
vec.push_back(A("abc"));

编译器是否会应用复制省略将临时对象A("abc")直接构造到.vectorAvec

4

2 回答 2

7

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

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

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

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

于 2012-08-09T02:31:09.660 回答
2

在一般情况下,它无法完成,它可能在此处作为vector模板完成,并且代码可能被内联,为优化器提供更多信息以完成其工作并减轻函数调用的一些要求。

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

于 2012-08-09T02:48:17.693 回答