gpt4 book ai didi

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

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

在编译一些代码时,我注意到在 -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/

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