c++中返回值优化生成的等效代码
Equivalent code generated in return value optimization in c++
我无法理解编译器如何能够在掩护下优化它。也就是说,它生成的等效代码是什么?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);
}
所以编译器可以找出它保留了内存来保存函数的返回值,它把它当作指向该内存的指针作为参数传递,并直接写入它,而不是在函数内部创建另一个临时对象,然后复制内存。
相关文章:
- 当返回值丢失时,C++ 代码行为异常
- 我无法理解此代码中的返回值
- 为什么我的代码会导致高返回值?C++
- 为什么我的代码返回了错误的平方值?C++
- Fibbonaci 递归代码返回错误值,始终返回下一个数字
- 停止代码块编译器并返回值
- 如何获取有关 Visual Studio 代码分析中未经检查的函数返回值的警告
- C 语法,根据此代码返回值类型
- 有没有办法为任何函数编写通用代码,以便它可以(异步)执行并从线程池中获得返回值?
- 我如何才能找到C 代码以找到所有未使用的返回值
- 为什么下面的使用链表实现线性队列的代码返回垃圾值然后崩溃
- 如何避免使用多个if-else来检查返回值是否为错误代码?
- 为什么我在此代码中没有得到返回值优化?
- 为什么要编译这个C++代码段(非void函数不返回值)
- 处理函数和返回值问题的特殊学校代码
- 当我们不关心返回值时,在 c++ 的代码片段中只调用一次函数的更好方法?
- 可以将用于向std::字符串返回const ref的函数更改为通过值break调用代码返回
- 为什么这段代码不能返回值为505.5的bpeeffect变量?
- 一维和二维数组中不需要的值更改,从 C++ 代码中的函数返回值
- 通过 Emscripten 生成的代码不返回值