让 test_speed.c 成为以下 C 代码:

#include <stdio.h>
int main(){
    int i;
    for(i=0; i < 1000000000; i++) {}
    printf("%d", i);
}

我在终端运行:
gcc -o test_speed test_speed.c

然后 :
time ./test_speed

我得到:

c - gcc -O3 怎么能跑得这么快?-LMLPHP

现在我运行以下命令:
gcc -O3 -o test_speed test_speed.c

然后 :
time ./test_speed

我得到:

c - gcc -O3 怎么能跑得这么快?-LMLPHP

第二次怎么跑得这么快?它是否已经在编译期间计算过?

最佳答案

gcc “知道”循环中没有主体,并且不依赖任何结果,无论是临时的还是真实的——因此它删除了循环。

godbolt.org 是一个很好的分析工具,它显示生成的程序集。根本不优化和 -O3 优化之间的区别是明显的:

无优化

c - gcc -O3 怎么能跑得这么快?-LMLPHP

带 -O3

c - gcc -O3 怎么能跑得这么快?-LMLPHP

关于c - gcc -O3 怎么能跑得这么快?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49633618/

10-14 06:41