GCC 优化 return 值

GCC optimize return value

此问题与 Function returning value vs modifying value passed by reference 有关。我想知道 gcc 是否会以同样的方式优化以下内容。想象一下这两个函数做同样的事情:

Return:

vector<int> f(...)
{
    vector<int> r;
    ...
    return r;
}

通过引用:

void f(vector<int> &r, ...)
{
    ...
}

vector<int> r;
f(r, ...)

引用传递经常出现在(性能关键的)GMP 函数中。

通常编译器没有义务执行 NRVO(命名为 Return 值优化),即复制省略,即使满足允许它的某些标准。程序也不必依赖于这样的优化,因为它实际上使其不可移植。

现在,就第一种情况而言,答案是肯定的,允许编译器优化掉向量的副本。特别是这种情况属于标准 12.8/p31.1 复制和移动 class 对象 [class.copy]:

的以下措辞

... elision of copy/move operations, called copy elision, is permitted in the following circumstances (which may be combined to eliminate multiple copies):

(31.1) — in a return statement in a function with a class return type, when the expression is the name of a nonvolatile automatic object (other than a function parameter or a variable introduced by the exceptiondeclaration of a handler (15.3)) with the same type (ignoring cv-qualification) as the function return type, the copy/move operation can be omitted by constructing the automatic object directly into the function’s return value.

此外,从 C++11 开始,std::vector 具有移动功能,实际上 vector 将被移动。

就第二种情况而言,答案是否定的。毕竟没有必要,因为您传递了对向量的引用。也就是说,您传递了向量的别名(即对象本身)。