Компиляторы 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