这是我在启用优化的情况下编译您的示例所获得的代码:
(__TEXT,__text) section
_main:
0000000100000f20 pushq %rbp
0000000100000f21 movq %rsp, %rbp
0000000100000f24 leaq 61(%rip), %rdi ## literal pool for: %.3f
0000000100000f2b movsd 45(%rip), %xmm0
0000000100000f33 movb $1, %al
0000000100000f35 callq 0x100000f3e ## symbol stub for: _printf
0000000100000f3a xorl %eax, %eax
0000000100000f3c popq %rbp
0000000100000f3d ret
请注意,循环甚至没有运行——编译器已经完全优化了它,因为它可以告诉唯一c
重要的分配是最后一个。
相反,重新插入注释行后,循环必须运行,输出代码如下所示:
(__TEXT,__text) section
_main:
0000000100000ea0 pushq %rbp
0000000100000ea1 movq %rsp, %rbp
0000000100000ea4 movss 148(%rip), %xmm5
0000000100000eac movl $100000000, %eax
0000000100000eb1 movsd 143(%rip), %xmm1
0000000100000eb9 movsd 143(%rip), %xmm2
0000000100000ec1 movsd 143(%rip), %xmm3
0000000100000ec9 movsd 143(%rip), %xmm4
0000000100000ed1 nopw %cs:(%rax,%rax)
0000000100000ee0 xorps %xmm0, %xmm0
0000000100000ee3 cvtss2sd %xmm5, %xmm0
0000000100000ee7 mulsd %xmm1, %xmm0
0000000100000eeb addsd %xmm2, %xmm0
0000000100000eef cvtsd2ss %xmm0, %xmm0
0000000100000ef3 cvtss2sd %xmm0, %xmm0
0000000100000ef7 movaps %xmm0, %xmm5
0000000100000efa mulsd %xmm3, %xmm5
0000000100000efe addsd %xmm4, %xmm5
0000000100000f02 decl %eax
0000000100000f04 cvtsd2ss %xmm5, %xmm5
0000000100000f08 jne 0x100000ee0
0000000100000f0a leaq 87(%rip), %rdi ## literal pool for: %.3f
0000000100000f11 movb $1, %al
0000000100000f13 callq 0x100000f1c ## symbol stub for: _printf
0000000100000f18 xorl %eax, %eax
0000000100000f1a popq %rbp
0000000100000f1b ret
如您所见,完全不同。