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

Lyi*_*Sky 7 c++ gcc memory-alignment compiler-optimization

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

-falign-标签

-falign-标签=正

将所有分支目标对齐为二次幂边界,跳过n个字节,如-falign-functions.此选项可以轻松地使代码变慢,因为它必须在通常的代码流中到达分支目标时插入虚拟操作.

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

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

如果未指定n或为零,则使用机器相关的默认值,该默认值很可能为"1",表示没有对齐.

在-O2,-O3级别启用.

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

gez*_*eza 5

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

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

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

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

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

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

(我的海湾合作委员会似乎将标签与8对齐)