假设我有类似的东西:
#define SIZE 32
/* ... */
unsigned x;
/* ... */
x %= SIZE;
x % 32
通常会被大多数 C/C++ 编译器(如 GCC)减少到吗x & 31
?
假设我有类似的东西:
#define SIZE 32
/* ... */
unsigned x;
/* ... */
x %= SIZE;
x % 32
通常会被大多数 C/C++ 编译器(如 GCC)减少到吗x & 31
?
是的,任何受人尊敬的编译器都应该执行此优化。具体来说,一个% X
运算,其中X
是 2 的恒定幂将成为一个& (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