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
将被移动。
就第二种情况而言,答案是否定的。毕竟没有必要,因为您传递了对向量的引用。也就是说,您传递了向量的别名(即对象本身)。
此问题与 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
将被移动。
就第二种情况而言,答案是否定的。毕竟没有必要,因为您传递了对向量的引用。也就是说,您传递了向量的别名(即对象本身)。