在c ++ 11中,是否仍然需要传入对接受函数输出的对象的引用?

Rob*_*lan 5 c++ move-semantics c++11 return-by-value

在C++ 11之前,如果我有一个在大型对象上运行的函数,我的本能就是用这种原型编写函数.

void f(A &return_value, A const &parameter_value);
Run Code Online (Sandbox Code Playgroud)

(这里,return_value只是一个空白对象,它将接收函数的输出.A只是一些庞大且复制成本高的类.)

在C++ 11中,利用移动语义,默认建议(据我所知)更直接:

A f(A const &parameter_value);
Run Code Online (Sandbox Code Playgroud)

是否仍然需要以旧方式执行此操作,传入一个对象来保存返回值?

How*_*ant 7

其他人已经介绍了A可能没有廉价移动构造函数的情况.我假设你A的确如此.但是还有一种情况可能需要传入"out"参数:

如果A类似某些类型vector或者string已知"out"参数已经具有可以在其中重用的资源(例如内存)f,那么如果可以的话,重用该资源是有意义的.例如考虑:

void get_info(std::string&);
bool process_info(const std::string&);

void
foo()
{
    std::string info;
    for (bool not_done = true; not_done;)
    {
        info.clear();
        get_info(info);
        not_done = process_info(info);
    }
}
Run Code Online (Sandbox Code Playgroud)

VS:

std::string get_info();
bool process_info(const std::string&);

void
foo()
{
    for (bool not_done = true; not_done;)
    {
        std::string info = get_info();
        not_done = process_info(info);
    }
}
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,容量将string在循环执行时积累,然后该容量可能在循环的每次迭代中重复使用.在第二种情况下,string在每次迭代时分配一个new (忽略小字符串优化缓冲区).

现在这并不是说你永远不应该std::string按价值回报.只是你应该了解这个问题并根据具体情况应用工程判断.