【问题标题】:GCC optimization steps [closed]GCC优化步骤[关闭]
【发布时间】:2015-10-15 11:54:21
【问题描述】:

我在工作或进行性能评估时遇到了一个问题:当我向代码中添加一些指令时,它的执行速度比初始代码快,我认为是由于编译器优化(未指定任何内容)。

编译器优化是如何工作的?特别是它们是在将 C 转换为汇编时还是在从汇编到二进制代码的步骤中执行的? 我想两者都有,但是有可能知道在每个步骤中执行了哪些优化?

我查看了程序集,但发现只有细微差别,因此我认为涉及到一些特定于架构的优化。

谢谢!

【问题讨论】:

  • Here is a talk 由遇到此类问题并解释它的编译器作者编写。答案是“编译器是复杂的野兽”。
  • 有一个名为“OPTIM_DISABLE”的标志,您必须将其设置为 yes 才能禁用优化。如果您阻止任何变量优化,请使用 volatile
  • @SohilOmer 你在哪里看到那面旗帜?要显式禁用优化,请在调用 gcc 时传递 -O0,但它已经是默认设置。 volatile 会阻止一些优化,但远非如此。
  • 感谢您的视频!我正在使用没有选项的 gcc(我想相当于 -O0)。 gcc 是否会执行一些优化?我在 gcc 手册中找到了一些默认优化,但与我的问题无关,但我仍在阅读。

标签: c gcc assembly compiler-optimization


【解决方案1】:

Assembly 是二进制代码,顺便说一句。大多数优化发生在高级语言编译为汇编时。添加功能并变得更快很奇怪……但是编译器优化有点黑魔法。

您可能能够深入了解它,您可以将您的 C 编译为程序集 (gcc -S) 并查看它对您的版本做了什么...当然请记住,并非所有指令都是平等创建的,如果您对汇编以及 CPU、总线和内存等如何在低级别工作有一定的了解,这将对您有所帮助。

【讨论】:

  • 感谢您的回答。我还没有分析组装,使用特定于我的 cpu 的表粗略计算成本。我担心的是隐藏通用寄存器的使用,这些改进是由 cpu 直接执行的,而不是在从汇编转换为二进制时?我想流水线是由 cpu 直接处理的,对吧?
  • 不完全是,CPU 在执行指令时当然负责流水线,但编译器知道流水线,并且可能会采取措施生成充分利用它的程序集,例如重新排序指令。
  • 所以,当我使用 gcc -S 获取程序集时,它仍然被优化以利用流水线,并且二进制代码中的以下转换几乎不是 1:1 转换 ams_op -> bin_op?跨度>
  • 是的,gcc -S 的输出会包含优化,所以 gcc -S -g、gcc -S -O0 和 gcc -S -O1 会越来越优化。汇编代码和二进制代码实际上是相同的,唯一可能的例外是如果 CPU 可以执行的特定操作不能由汇编助记符及其参数表示,而且我不确定这些天是否仍然发生这种情况。当然,这将是一个非常罕见的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 2012-04-01
相关资源
最近更新 更多