c++ - 返回语句与接受指针写入

标签 c++ function return

<分区>

Possible Duplicate:
In C++, is it still bad practice to return a vector from a function?

在性能方面,当需要从一个函数中返回像std::vectorstd::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。

关于c++ - 返回语句与接受指针写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14465371/

相关文章:

c++ - 递归函数抛出非空函数结束警告

c++ - 使用数组实现四叉树

c++ - 不确定为什么我的函数一直返回相同的值

java - JFace Dialog 处理提交的数据 ( okPressed )

javascript - 为什么函数返回 bool 值?

android - 从数据库中读取一个值

c++ - dll中的QT事件循环

c# - void** 的含义是什么?

javascript - 组合函数添加新参数

javascript - 在 JavaScript 中声明一个没有名字的函数