编译器如何优化这段代码

用户名

考虑以下循环:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章