GCC优化回报价值

时间:2015-11-27 23:26:11

标签: c++ gcc return-value pass-by-reference

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

返回:

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

通过引用传递:

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

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

通过引用传递(性能关键)GMP功能。

1 个答案:

答案 0 :(得分:0)

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

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

  

...允许复制/移动操作的省略,称为复制省略   以下情况(可以合并消除   多份):

     

(31.1) - 在带有a的函数的return语句中   class返回类型,当表达式是非易失性的名称时   自动对象(函数参数或变量除外)   由处理程序(15.3)的异常声明引入   相同的类型(忽略cv-qualification)作为函数返回类型,   通过构造自动化可以省略复制/移动操作   直接将对象转换为函数的返回值。

此外,从C ++ 11及以后obj.key2有移动设施,实际上std::vector将被移动。

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