【发布时间】:2015-06-06 20:27:01
【问题描述】:
我使用 0 级和 3 级优化编译了以下函数
g++版本4.7.2 20120921:
double function1(double a, double b)
{
return (a+b)*(a+b);
}
0级优化版本的反汇编提供:
0000000000000000 <_Z9function1dd>:
0: 55 push rbp
1: 48 89 e5 mov rbp,rsp
4: f2 0f 11 45 f8 movsd QWORD PTR [rbp-0x8],xmm0
9: f2 0f 11 4d f0 movsd QWORD PTR [rbp-0x10],xmm1
e: f2 0f 10 45 f8 movsd xmm0,QWORD PTR [rbp-0x8]
13: 66 0f 28 c8 movapd xmm1,xmm0
17: f2 0f 58 4d f0 addsd xmm1,QWORD PTR [rbp-0x10]
1c: f2 0f 10 45 f8 movsd xmm0,QWORD PTR [rbp-0x8]
21: f2 0f 58 45 f0 addsd xmm0,QWORD PTR [rbp-0x10]
26: f2 0f 59 c1 mulsd xmm0,xmm1
2a: f2 0f 11 45 e8 movsd QWORD PTR [rbp-0x18],xmm0
2f: 48 8b 45 e8 mov rax,QWORD PTR [rbp-0x18]
33: 48 89 45 e8 mov QWORD PTR [rbp-0x18],rax
37: f2 0f 10 45 e8 movsd xmm0,QWORD PTR [rbp-0x18]
3c: 5d pop rbp
3d: c3 ret
3 级优化提供:
0000000000000000 <_Z9function1dd>:
0: f2 0f 58 c1 addsd xmm0,xmm1
4: f2 0f 59 c0 mulsd xmm0,xmm0
8: c3 ret
在未优化的版本中,为什么代码做了这么多额外的工作?具体来说,是什么原因导致mulsd之后的4条指令?他们所做的只是将xmm0 移动到内存,从内存移动到rax,然后返回到内存,然后再返回到xmm0。
【问题讨论】:
-
In the unoptimized version, why does the code do so much extra work?嗯,这就是为什么它被称为“未优化”。 -
@PaulMcKenzie 所以编译器从 3 开始,然后添加代码以将其优化到 0 级? :)
-
很可能,编译器不会“向前看”,而是看到您正在乘以相同的数量
a+b(所以它也可能是(a+b) * (c+d)。之后的行看起来像在rax寄存器中设置返回值。 -
如果你编译'int a = 2;诠释 b = 2;例如 int c = a + b' 并在未优化的情况下编译它,编译器将继续并将它们添加到寄存器中。优化它不会。
-
@teppic 在这种情况下,它会在优化的情况下直接将 4 加载到
c。在未优化的情况下,不会将其保存到不必要的内存位置。
标签: c++ gcc optimization floating-point g++