次のようなものがあるとしましょう:
#define SIZE 32
/* ... */
unsigned x;
/* ... */
x %= SIZE;
一般に、GCC などのほとんどの C/C++ コンパイラによってx % 32
縮小されますか?x & 31
次のようなものがあるとしましょう:
#define SIZE 32
/* ... */
unsigned x;
/* ... */
x %= SIZE;
一般に、GCC などのほとんどの C/C++ コンパイラによってx % 32
縮小されますか?x & 31
はい、立派なコンパイラはこの最適化を実行する必要があります。具体的には、 が一定の 2 の累乗で% X
ある操作は、操作と同等になります。X
& (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