我不能理解编译器是如何在幕后优化它的。也就是说,它生成的等价代码是什么?有一个在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
}它没有说优化后的等效代码。
发布于 2011-05-07 08:10:35
好的,页面已经被证明不是很清晰,因为我在第一次扫描时读错了(哦)。下面列出了在优化之前的
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);
}即:允许编译器直接在返回值的目标上工作,绕过函数体内临时实例的构造/销毁/复制。
发布于 2011-05-07 08:15:52
struct Data { char bytes[16]; };
void f(Data * useThisInsteadOfReturning)
{
// update *useThisInsteadOfReturning directly
}
int main()
{
Data d;
f(&d); // use d in the function
}发布于 2011-05-07 08:21:01
优化后的代码显示在您提到的代码下面。引用维基百科网站的话:
struct Data { char bytes[16]; };
void f(Data * p)
{
// generate result directly in *p
}
int main()
{
Data d;
f(&d);
}因此,编译器可以确定它保留了内存来保存函数的返回值,并将其视为指向该内存的指针已作为参数传递,然后直接写入内存,而不是在函数内部创建另一个临时对象,然后复制内存。
https://stackoverflow.com/questions/5918191
复制相似问题