【发布时间】:2012-05-15 15:23:19
【问题描述】:
我有一个非常基本的 C++ 问题。 返回对象时如何避免复制?
这是一个例子:
std::vector<unsigned int> test(const unsigned int n)
{
std::vector<unsigned int> x;
for (unsigned int i = 0; i < n; ++i) {
x.push_back(i);
}
return x;
}
据我了解 C++ 的工作原理,此函数将创建 2 个向量:本地向量 (x),以及将返回的 x 的副本。有没有办法避免复制? (而且我不想返回指向对象的指针,而是返回对象本身)
使用“移动语义”的函数的语法是什么(在 cmets 中有说明)?
【问题讨论】:
-
不一定会创建副本。 NRVO 或移动语义可以防止这种情况发生。
-
您可以依靠您的编译器来执行 NRVO 魔术或明确使用移动语义。
-
“将返回的 x 的副本”可以通过从 x 移动来构造,或者它的构造被省略以成为与 x 相同的对象。该语言的语义已经避免了任何复制。
-
响应您的编辑 - 您根本不需要更改语法。任何符合复制省略的条件都必须使用移动构造(如果构造没有完全省略)。
标签: c++ object copy return return-value