c++中返回值优化生成的等效代码

Equivalent code generated in return value optimization in c++

本文关键字:代码 返回值 优化 c++      更新时间:2023-10-16

我无法理解编译器如何能够在掩护下优化它。也就是说,它生成的等效代码是什么?http://en.wikipedia.org/wiki/Return_value_optimization中提到的一个示例显示了优化前的代码:

struct Data { char bytes[16]; };
Data * f(Data * __hiddenAddress)
{
    Data result = {};
    // copy result into hidden object
    *__hiddenAddress = result;
    return __hiddenAddress;
}
int main()
{
    Data __hidden; // create hidden object
    Data d = *f(&__hidden); // copy the result into d
}

没有说优化后的等效代码

好吧,这个页面已经被证明不太清楚,因为我在第一次扫描时就读错了(哎呀)。以下是优化前的:

struct Data { char bytes[16]; };
Data f()
{
  Data result = {};
  // generate result
  return result;
}
int main()
{
  Data d = f();
}

您列出的代码是编译器可能解释的未优化的伪版本,完成了临时和复制构造。它所展示的是编译器如何将返回值的函数转换为过程代码(返回值传递机制)。

之后,仍然列出了优化后的代码:

struct Data { char bytes[16]; };
void f(Data * p)
{
  // generate result directly in *p
}
int main()
{
  Data d;
  f(&d);
}

。:允许编译器直接处理返回值的目标,绕过函数体中的临时实例的构造/销毁/复制。

struct Data { char bytes[16]; };
void f(Data * useThisInsteadOfReturning)
{ 
   // update *useThisInsteadOfReturning directly
}
int main()
{
  Data d;
  f(&d); // use d in the function
}

优化后的代码如下所示。引用自维基百科网站:

struct Data { char bytes[16]; };
void f(Data * p)
{
   // generate result directly in *p
}
int main()
{
   Data d;
   f(&d);
}

所以编译器可以找出它保留了内存来保存函数的返回值,它把它当作指向该内存的指针作为参数传递,并直接写入它,而不是在函数内部创建另一个临时对象,然后复制内存。