[英]GCC optimize return value
这个问题与函数返回值与引用传递的修改值有关 。 我想知道gcc是否会以相同的方式优化以下内容。 想象这两个函数做同样的事情:
返回:
vector<int> f(...)
{
vector<int> r;
...
return r;
}
通过参考传递:
void f(vector<int> &r, ...)
{
...
}
vector<int> r;
f(r, ...)
在性能至关重要的GMP功能中,按引用传递经常发生。
通常,即使满足某些条件,编译器也没有义务进行NRVO(命名返回值优化)或复制省略。 程序也不必依赖于此类优化,因为它实际上使其不可移植。
现在,就第一种情况而言,答案是肯定的,编译器可以优化去除向量的副本。 特别是这种情况属于标准12.8 / p31.1复制和移动类对象[class.copy]的以下措辞:
...在以下情况下允许复制/移动操作省略,称为复制删除(可以合并以消除多份副本):
(31.1)—在具有类返回类型的函数中的return语句中,当表达式是具有以下内容的非易失性自动对象(函数参数或由处理程序的异常声明(15.3)引入的变量除外)的名称时:与函数返回类型相同(忽略cv限定)的类型,可以通过将自动对象直接构造为函数的返回值来省略复制/移动操作。
同样,从C ++ 11开始, std::vector
具有移动工具,实际上vector
将被移动。
至于第二种情况,答案是否定的。 毕竟没有必要了,因为您传递了对向量的引用。 也就是说,您传递矢量的别名(即对象本身)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.