这里是否还有副本:
std::vector<int> &f = foo();
其中foo
的原型是
std::vector<int> foo();
答案 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 );
保证在任何地方都没有副本。它不漂亮, 但如果分析显示复制是这里的瓶颈,那应该是 考虑。