Компиляторы C/C++, такие как GCC, обычно оптимизируют по модулю с постоянной степенью 2?

Допустим, у меня есть что-то вроде:

#define SIZE 32

/* ... */

unsigned x;

/* ... */

x %= SIZE;

Будет ли x % 32 как правило, сводится к x & 31 большинством C/C++ компиляторов, таких как GCC?

1 ответ

Решение

Да, любой респектабельный компилятор должен выполнить эту оптимизацию. В частности, % X операция, где X постоянная степень двух станет эквивалентом & (X-1) операция.

GCC даже сделает это с отключенными оптимизациями:

Пример (gcc -c -O0 версия 3.4.4 на Cygwin):

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
Другие вопросы по тегам