此问题与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功能。
答案 0 :(得分:0)
通常编译器没有义务进行NRVO(命名返回值优化)即复制省略,即使满足允许它的某些标准。程序也不一定依赖于这样的优化,因为它使它实际上不可移植。
现在,就第一种情况而言,答案是肯定的,允许编译器优化掉矢量的副本。特别是这种情况属于标准的以下措辞 12.8 / p31.1复制和移动类对象[class.copy] :
...允许复制/移动操作的省略,称为复制省略 以下情况(可以合并消除 多份):
(31.1) - 在带有a的函数的return语句中 class返回类型,当表达式是非易失性的名称时 自动对象(函数参数或变量除外) 由处理程序(15.3)的异常声明引入 相同的类型(忽略cv-qualification)作为函数返回类型, 通过构造自动化可以省略复制/移动操作 直接将对象转换为函数的返回值。
此外,从C ++ 11及以后obj.key2
有移动设施,实际上std::vector
将被移动。
就第二种情况而言,答案是否定的。毕竟没有必要,因为你传递了对向量的引用。也就是说,传递向量的别名(即对象本身)。