考虑以下循环:
unsigned long x = 0;
for(unsigned long i = 2314543142; i > 0; i-- )
x+=i;
std::cout << x << std::endl;
当我正常编译时,执行此循环大约需要6.5秒。但是,当我使用-O3优化进行编译时,循环将在10 ^ -6秒内执行。这怎么可能?编译器肯定不知道x的封闭形式表达式...
如果启用了优化功能,则您不必真正了解汇编程序就可以知道编译器在编译时确定x的值。
我稍加修改了您的代码,以能够使用在线工具Compiler Explorer,将更std::cout << x << std::endl
改为extern unsigned long foo;
和foo = x;
。并不是必须的,但是可以使输出更整洁。
与-O2一起编译:
test():
movabs rax, 2678554979246887653
mov QWORD PTR foo[rip], rax
ret
用-O0编译:
test():
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-8], 0
mov DWORD PTR [rbp-16], -1980424154
mov DWORD PTR [rbp-12], 0
jmp .L2
.L3:
mov rax, QWORD PTR [rbp-16]
add QWORD PTR [rbp-8], rax
sub QWORD PTR [rbp-16], 1
.L2:
cmp QWORD PTR [rbp-16], 0
setne al
test al, al
jne .L3
mov rax, QWORD PTR [rbp-8]
mov QWORD PTR foo[rip], rax
leave
ret
另外:由于i >= 0
输出的原因,具有未定义行为的代码的第一个修订版:
test():
.L2:
jmp .L2
:-)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句