c – 编译器如何优化这段代码

c – 编译器如何优化这段代码,第1张

概述考虑以下循环: 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的封闭表单表达式如何… 如果使用优化进 考虑以下循环:

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

总结

以上是内存溢出为你收集整理的c – 编译器如何优化这段代码全部内容,希望文章能够帮你解决c – 编译器如何优化这段代码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1217546.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存