【问题标题】:Do C/C++ compilers such as GCC generally optimize modulo by a constant power of 2?诸如 GCC 之类的 C/C++ 编译器通常会以 2 的恒定幂优化模吗?
【发布时间】:2014-04-22 04:32:55
【问题描述】:

假设我有类似的东西:

#define SIZE 32

/* ... */

unsigned x;

/* ... */

x %= SIZE;

大多数 C/C++ 编译器(如 GCC)通常会将 x % 32 缩减为 x & 31 吗?

【问题讨论】:

  • @JonathonReinhart 哎呀,我的意思是x % 32x & 31

标签: gcc constants compiler-optimization modulo compile-time-constant


【解决方案1】:

是的,任何受人尊敬的编译器都应该执行此优化。具体来说,% X 操作,其中X2 的恒定幂,将等效于 & (X-1) 操作。

GCC 甚至会在关闭优化的情况下执行此操作:

示例(gcc -c -O0 Cygwin 上的版本 3.4.4):

unsigned int test(unsigned int a) {
   return a % 32;
}

结果(objdump -d):

00000000 <_test>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   8b 45 08                mov    0x8(%ebp),%eax
   6:   5d                      pop    %ebp
   7:   83 e0 1f                and    $0x1f,%eax          ;; Here
   a:   c3                      ret

【讨论】:

  • 如果不启用优化,它会像将(5 + 5) 减少到10 一样吗?
  • @Matt 已更新。是的,GCC 可以。此外,向您展示这些命令应该使您能够自己尝试任何类似的想法。
  • 自己尝试只会告诉我我的特定实现。
  • 这里的常见误解...-O0 不会禁用 GCC 中的优化。 The GCC documentation 表示-O0减少编译时间并使调试产生预期的结果。例如,在 GCC Debian 6.3.0 上,gcc -O0 -Q --help=optimizers | grep enabled | wc -l 建议保持启用 53 项优化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
相关资源
最近更新 更多