像GCC这样的C / C ++编译器通常会以2的恒定幂来优化模数吗?

时间:2014-03-17 03:28:09

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

让我说我有类似的东西:

#define SIZE 32

/* ... */

unsigned x;

/* ... */

x %= SIZE;

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

1 个答案:

答案 0 :(得分:22)

是的,任何可敬的编译器都应该执行此优化。具体来说,% X操作,其中X 2的持续幂,将等同于& (X-1)操作。

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

示例(关于Cygwin的gcc -c -O0版本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