为什么GCC明确表示它会减慢程序时,会在O2 / O3上启用优化?

时间:2017-07-08 20:07:36

标签: c++ gcc compiler-optimization memory-alignment

引自https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

  

-falign的标签

     

-falign-标签= N

     

将所有分支目标对齐到2的幂边界,跳过n个字节,如-falign-functions。 此选项很容易   使代码更慢,因为它必须在插入时插入虚拟操作   在通常的代码流程中达到了分支目标。

     

-fno-align-labels和-falign-labels = 1是等效的,表示标签未对齐。

     

如果-falign-loops或-falign-jumps适用且大于   这个值,然后使用它们的值。

     

如果未指定n或为零,请使用与机器相关的默认值   这很可能是'1',意味着没有对齐。

     

在-O2,-O3等级启用。

更多地考虑这个标志会让它失去更多的意义......有引发代码缓存未命中的后果,甚至启用意味着什么时候参数需要数值(1 ..)?

1 个答案:

答案 0 :(得分:5)

它没有这么说。它说可以轻松地使代码变慢。这意味着,在某些情况下,它可以使代码变慢。在其他情况下,它可以使代码更快。

对齐会导致代码运行速度变慢:

  • 增加了代码大小,因此代码不在缓存中的可能性更高。
  • 添加nop操作减慢代码

对齐可能导致更快地运行代码:分支预测,指令获取和上帝知道什么。

在单if的情况下,很难说哪种效果更强。这取决于条件。

但是,对于循环,通常代码变得更快。为什么?因为慢因子只发生一次,但循环的每个循环都会更快地执行。

(我的GCC似乎将标签与8对齐)