21

次のようなものがあるとしましょう:

#define SIZE 32

/* ... */

unsigned x;

/* ... */

x %= SIZE;

一般に、GCC などのほとんどの C/C++ コンパイラによってx % 32縮小されますか?x & 31

4

1 に答える 1

30

はい、立派なコンパイラはこの最適化を実行する必要があります。具体的には、 が一定の 2 の累乗で% Xある操作は、操作と同等になります。X& (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 に答える