让我说我有类似的东西:
#define SIZE 32
/* ... */
unsigned x;
/* ... */
x %= SIZE;
大多数C / C ++编译器(例如GCC)x % 32
通常会减少到x & 31
吗?
答案 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