将返回类型分配给引用,是否进行复制?

时间:2011-11-23 15:06:06

标签: c++ reference

这里是否还有副本:

std::vector<int> &f = foo();

其中foo的原型是

std::vector<int> foo();

2 个答案:

答案 0 :(得分:8)

foo()返回一个临时对象,该对象无法绑定到非const 引用。

做其中一项:

//temporary can be bound to const-reference, so this is ok
const std::vector<int> &f = foo();  //no copy takes place.

//or save a copy of temporary
std::vector<int> f = foo(); //copy takes place (may be optimized by compiler)

阅读上面的评论。在第二个版本(非参考版本)中,编译器可以优化返回值,避免复制临时。这也取决于foo()的实现。

见:

答案 1 :(得分:2)

你的代码不合法​​。应该是:

std::vector<int> const& f = foo();

std::vector<int> f = foo();

该标准允许在两种情况下都复制(至少C ++ 03做了 - 我 认为C ++ 11在第一种情况下将事情搞砸了);它需要它 既不是,也不知道实际上有副本的编译器 两种情况。但是,如果你真的担心副本,那就改变了 foo声明:

void foo( std::vector<int>& results );

并使用:

std::vector<int> f;
foo( f );

保证在任何地方都没有副本。它不漂亮, 但如果分析显示复制是这里的瓶颈,那应该是 考虑。