编译器优化导致程序运行速度变慢

标签 c gcc compiler-optimization

我有以下用 C 语言编写的代码。它相当简单,因为它对 for 的每个循环都进行了正确的位移 x

int main() {
   int x = 1;
   for (int i = 0; i > -2; i++) {
      x >> 2;
   }
}

现在发生的奇怪事情是,当我在没有任何优化或第一级优化(-O)的情况下编译它时,它运行得很好(我正在计时可执行文件及其大约1.4s with -O5.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/

相关文章:

gcc - 如何在 cmake 中仅针对 DEBUG build设置 GLIBCXX_FORCE_NEW=1?

c++ - C++ 编译器如何优化不正确的分层向下转换以导致真正的未定义行为

c - double free or corruption (fasttop) 错误 c/c++ linux

C - 检查 NULL 值

c - 是否可以使用 GCC 获得经过优化的中间 C 文件?

c++ - 初始化程序无法确定字符数组的大小

performance - 难以理解和比较 CPU 性能指标

c++ - 在 gcc 中使用 O2 时如何将此 vector 优化快 10 倍?

c - 递归列表

c - ifaddrs.h 中的 getnameinfo() 给出了 C 中的垃圾值