我有以下用 C 语言编写的代码。它相当简单,因为它对 for 的每个循环都进行了正确的位移 x
。
int main() {
int x = 1;
for (int i = 0; i > -2; i++) {
x >> 2;
}
}
现在发生的奇怪事情是,当我在没有任何优化或第一级优化(-O
)的情况下编译它时,它运行得很好(我正在计时可执行文件及其大约1.4s
with -O
和 5.4s
没有任何优化。
现在,当我为编译添加 -O2
或 -O3
开关并对生成的可执行文件计时时,它不会停止(我已经测试了多达 60s
).
关于可能导致此问题的任何想法?
最佳答案
优化循环正在产生一个无限循环,这是您依赖于有符号整数溢出的结果。有符号整数溢出是 C
中的未定义行为,不应依赖。它不仅会使开发人员感到困惑,而且可能会被编译器优化掉。
程序集(无优化):gcc -std=c99 -S -O0 main.c
_main:
LFB2:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
movl $1, -4(%rbp)
movl $0, -8(%rbp)
jmp L2
L3:
incl -8(%rbp)
L2:
cmpl $-2, -8(%rbp)
jg L3
movl $0, %eax
leave
ret
程序集(优化级别 3):gcc -std=c99 -S -O3 main.c
_main:
LFB2:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
L2:
jmp L2 #<- infinite loop
关于编译器优化导致程序运行速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7124058/