为啥 gcc -O1 的行为与 gcc -O0 + 选项不同
Posted
技术标签:
【中文标题】为啥 gcc -O1 的行为与 gcc -O0 + 选项不同【英文标题】:Why does gcc -O1 behave differently than gcc -O0 + options为什么 gcc -O1 的行为与 gcc -O0 + 选项不同 【发布时间】:2015-11-22 00:10:00 【问题描述】:鉴于 gcc 文档 (https://gcc.gnu.org/onlinedocs/gcc-5.2.0/gcc.pdf) 指定 -O1 是 -O0 加上特定的选项列表,为什么当我使用 -O1 编译代码时,编译时间比使用 -O0 长 2 倍+ 当 -O1 打开时列出的所有选项都被启用?是否还有其他未在文档中指定的选项(我怀疑),或者在后台发生了其他更险恶的事情?
如果文档刚刚过时,那我会很感兴趣,如果只是为了更好地了解 GCC 和我的代码可用的优化选项。
【问题讨论】:
多么注重细节的问题啊!我喜欢它。 你不能让 GCC 打印出所有启用选项的列表并进行比较吗? "...或者还有其他更险恶的事情在后台发生..." - 请告诉我们更多信息! (我喜欢一个好的阴谋论:-)) 就像@MicroVirus 指出的可能重复的文件一样,文档清楚地写着Not all optimizations are controlled directly by a flag. Only optimizations that have a flag are listed in this section.
。
“指定 -O1 是 -O0 加上一个特定的选项列表”你能在你的帖子中包含一个准确的报价吗?我很确定它从来没有这么说,你只是解释了。
【参考方案1】:
如果文档刚刚过时...
文档不准确是一个合理的假设。会发生这样的事情。
另一种可能是您误读了文档。我对您链接到的文档(第 111 页)的阅读是 -O
和 -O1
应该是同一个意思。如果这是正确的,那么您显然尝试做的事情没有多大意义。
我建议您查看 GCC 源代码,以了解 -O1
的具体实现方式。这应该告诉您您所看到的行为是否可以通过不准确的文档1 来解释,或者这里是否还有其他原因。
1 - 如果问题是文档不准确,您可以通过提交包含更正的错误报告来帮助 GCC 人员并最终帮助其他 GCC 用户。
【讨论】:
以上是关于为啥 gcc -O1 的行为与 gcc -O0 + 选项不同的主要内容,如果未能解决你的问题,请参考以下文章
为啥 GCC 会为几乎相同的 C 代码生成如此完全不同的程序集?
GCC `-fsanitize=bounds` 与`std::array` 的奇怪行为