Possible Duplicate:
In C++, is it still bad practice to return a vector from a function?
在性能方面,当需要从一个函数中返回像std::vector
或std::string
这样的'较重'的对象时,是否推荐使用此表单:
void func(std::vector<int> *dest)
{
}
代替这种形式:
std::vector<int> func()
{
std::vector<int> arr;
// ...
return arr;
}
我假设第一种形式应该更快,但与此同时我经常看到第二种形式,Qt API 通常返回一个 QString
例如,可能是因为它是使用起来更加方便或直观。
我还想知道是否有编译器优化可以在使用 return 语句时删除不必要的对象复制。
编辑
是否有任何流行的编译器今天仍在使用,但不执行答案中提到的优化?
is it recommended to use [pass by pointer] instead of [return by value]?
否。
A modern C++ compiler performs named return value optimisation (NRVO)这实际上意味着编译器可靠地省略了此处的拷贝。不执行复制。
请注意,这与您使用的是哪个 C++ 版本无关:C++03 与 C++11 一样。 C++11 中唯一发生变化的是,当无法执行复制省略时,该语言使库可以更轻松地高效地移出一个值(就像这里发生的那样)。。 p>
对于返回值,通常可以执行复制省略——它在其他情况下更为相关(例如,按值传递参数)。不过也有异常(exception);以下代码不能使用命名返回值优化。不过,它可以使用 C++11 移动:
std::string foo() {
std::string one = "Foo";
std::string two = "Bar";
if (rand() % 2 == 0)
return one;
else
return two;
}
原因是现在两个代码路径返回不同的命名对象;这可以防止 NRVO。