当GCC明确表示优化会使程序变慢时,为什么会在O2/O3级别启用优化?

7

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

-falign-labels

-falign-labels=n

将所有分支目标对齐到2的幂边界,跳过最多n个字节,类似于-falign-functions。由于必须在代码的常规流程中到达分支目标时插入虚拟操作,因此该选项很容易使代码变慢

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

如果适用-falign-loops或-falign-jumps,并且它们大于此值,则使用它们的值。

如果未指定n或为零,则使用机器相关的默认值,这很可能是“1”,表示没有对齐。

在-O2、-O3级别下启用。

更深入地思考这个标志会让它失去更多意义...触发代码缓存未命中的后果以及启用参数时什么含义(1..)?


1
如果未指定n或者为零,则使用机器相关的默认值,很可能是‘1’,表示无对齐。因此,默认情况下,gcc会使用机器相关的值。 - Justin
1
如果我没记错的话,这是一个大小优化。 - stelioslogothetis
1
这是一个有趣的问题,感谢您的发布。 - Alex Reynolds
1
@stybl 怎么可能一种不需要添加空操作的优化能成为大小优化呢? - user207421
1个回答

5
它并没有这么说,它说可以很容易地使代码变慢。这意味着,在某些情况下,它可能会使代码变慢。在其他情况下,它可能会使代码变快。
对齐导致代码运行更慢:
  • 增加了代码大小,所以代码不在高速缓存中的几率更高。
  • 添加的nop操作会减缓代码速度。
对齐可能会导致代码运行更快:分支预测、指令获取等等。
在单个if的情况下,很难说哪个效果更强。这取决于条件。
然而,对于循环来说,通常代码会更快。为什么?因为慢的因素只会发生一次,但是每个循环周期都将更快地执行。
(我的GCC似乎将标签对齐到8)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接