【发布时间】:2013-08-09 23:21:52
【问题描述】:
我有一个返回向量或集合的函数:
set<int> foo() {
set<int> bar;
// create and massage bar
return bar;
}
set<int> afoo = foo();
在这种情况下,我在函数 foo() 中创建了一个临时内存空间,然后
通过复制将其分配给afoo。我真的很想避免这个副本,任何简单的方法我
可以在 C++11 中做到这一点吗?我认为这与右值有关。
好的,更新问题:如果我要返回自己定义的对象, 不是向量或集合,这是否意味着我应该定义一个移动构造函数? 像这样:
class value_to_return {
value_to_return (value_to_return && other) {
// how to write it here? I think std::move is supposed to be used?
}
}
谢谢!!!
【问题讨论】:
-
您现在所拥有的不会在 C++11 中复制任何内容。它可能会采取行动,但即使是那些也几乎肯定会被 N/RVO 优化掉。
-
“当我返回时如何避免复制” - 使用不超过 10 年前发布的编译器进行编译。
-
@MooingDuck:在我工作的地方,“C++”的意思是“C++03”,最早在 2020 年之前不太可能改变。我怀疑 90% 以上的专业 C++ 程序员也是如此。 (大型组织雇用他们中的大多数,而大型组织的行动非常缓慢。)事实上,C++11 很有可能成为“C++ 的 C99”
-
@Nemo:我认为你夸大了没有 C++11 的组织的数量。即使您不是,官方 C++ 也值得提及,即使答案还提供了 C++03 的详细信息。
-
@Lightness:这个问题专门讨论了 C++11。我检查了编辑历史,没有证据表明它没有专门询问 C++。所以是的,任何没有提到右值引用的答案都是不足的。
标签: c++ c++11 rvalue-reference