21

假设我有类似的东西:

#define SIZE 32

/* ... */

unsigned x;

/* ... */

x %= SIZE;

x % 32通常会被大多数 C/C++ 编译器(如 GCC)减少到吗x & 31

4

1 回答 1

30

是的,任何受人尊敬的编译器都应该执行此优化。具体来说,一个% X运算,其中X是 2 的恒定幂将成为一个& (X-1)运算的等价物。

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

示例(gcc -c -O0Cygwin 上的 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
于 2014-03-17T03:33:44.523 回答