为啥 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 + 选项不同的主要内容,如果未能解决你的问题,请参考以下文章

模板专业化,Windows 与 gcc 上的不同行为?

为啥文件命令报告动态与 gcc -static 链接

为啥 GCC 会为几乎相同的 C 代码生成如此完全不同的程序集?

GCC `-fsanitize=bounds` 与`std::array` 的奇怪行为

__unused标记行为/用法(GCC与Objective-C)

GCC的std :: sort与lambdas的不稳定行为