编译器是否会优化使两个不同C++函数生成完全相同的汇编代码?
优化结果真实性确认
你观测到的优化结果完全成立,a()和b()的执行逻辑100%等价,运行时不会有任何差异。
虽然struct A用了三个独立int成员、struct B用了int数组成员,但两者的内存布局完全一致,求和逻辑本质也没有区别,编译器完全可以识别出两者的运算逻辑等价。
编译期常量折叠原理
你提供的代码里,a()和b()的输入都是固定编译期常量:
- 两个结构体初始化的数值都是55、67、12,求和结果固定为
55 + 67 + 12 = 134 - 非-O0优化等级下,编译器会默认开启常量折叠优化,直接在编译阶段完成所有常量运算,包括
sqrt的计算,不需要在运行时执行加法、循环、调用sqrt库函数,所以你看不到sqrt的调用逻辑。
常量1094268577的含义
这个常量是单精度浮点数sqrt(134)的32位二进制整数形式表示:
- 1094268577转换为十六进制为
0x41370A3D - 按照IEEE 754单精度浮点数标准解析,该数值对应约
11.5758369,也就是sqrt(134)的近似值 - 编译器提前把计算好的结果存在常量段
.LC0中,两个函数运行时只需要把这个常量读取到返回寄存器xmm0就直接返回,所以汇编代码完全一致。
内容的提问来源于stack exchange,提问作者johnbakers
相关产品推荐
相关产品推荐

