c - GCC 中 -O0 和 -O1 的区别

标签 c gcc embedded arm

在编译一些代码时,我注意到在 -O0 和 -O1 之间创建的汇编程序存在很大差异。我想通过启用/禁用优化来运行,直到我发现是什么导致了汇编器中的特定更改。

如果我使用 -fverbose-asm 来准确找出 O1 与 O0 相比启用了哪些标志,然后手动禁用它们,为什么生成的汇编程序仍然有如此大的不同?即使我使用 O0 运行 gcc 并手动添加 fverbose-asm 所说的使用 O1 启用的所有标志,我也不会得到与使用 O1 时相同的汇编程序。

除了“-f...”和“-m...”之外还有什么可以更改的吗?

或者说只是'O1'与'O0'相比有一些无法关闭的魔力。


抱歉隐瞒 - 这与 Reducing stack usage during recursion with GCC + ARM 有关然而,提到它使问题有点难以理解。

最佳答案

如果您只想查看哪些通行证在 O1 启用,哪些在 O0 未启用,您可以运行如下命令:

gcc -O0 test.c -fdump-tree-all -da
ls > O0
rm -f test.c.*
gcc -O1 test.c -fdump-tree-all -da
ls > O1
diff O0 O1

一个类似的过程,使用您发现的标志集,将让您看到 GCC 在 O1 进行了哪些不受标志控制的额外魔法传递。

编辑:

一个不那么困惑的方法可能是比较 -fdump-passes 的输出,它将列出哪些 channel 是 ON 或 OFF 到 stderr。

所以像这样:

gcc -O0 test.c -fdump-passes |& grep ON > O0
gcc -O1 test.c -fdump-passes |& grep ON > O1
diff O0 O1

关于c - GCC 中 -O0 和 -O1 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13157352/

相关文章:

c - 发现理解 C 中指针的困难

c - 尝试在整数数组中复制命令行参数时出现段错误

c - 不知道如何在三维C中提取二维数组

c++ - 我是否必须在Ubuntu 18.04上从源代码构建gcc-10,才能卸载OpenMP GPU目标?

c - 用于区分 arm-none-eabi-gcc 和 gcc 的预定义宏

linux - 为什么 Qt 无法在我的新硬件上初始化显示

c++ - C/C++ Python 解释器

c++ - 将 unsigned long long int 转换为 signed long long int 可能吗?

c - 是什么让 SPI 比 I2C 协议(protocol)更快

CUPS 对 cupsGetDests() 的 undefined reference