gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:10:11 25 4
gpt4 key购买 nike

考虑以下循环:

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::endlextern 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++ - 编译器如何优化这段代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41403951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com