Хорошо известно, что
static inline int is_odd_A(int x) { return x & 1; }
эффективнее
static inline int is_odd_B(int x) { return x % 2; }
Но при включенном оптимизаторе is_odd_B
не будет отличаться от is_odd_A
? Нет - с gcc-4.2 -O2
получаем (в сборке ARM):
_is_odd_A:
and r0, r0, #1
bx lr
_is_odd_B:
mov r3, r0, lsr #31
add r0, r0, r3
and r0, r0, #1
rsb r0, r3, r0
bx lr
Мы видим, что is_odd_B
требует на 3 инструкции больше, чем is_odd_A
, основная причина в том, что
((-1) % 2) == -1
((-1) & 1) == 1
Однако , все следующие версии будут генерировать тот же код, что и is_odd_A
:
#include <stdbool.h>
static inline bool is_odd_D(int x) { return x % 2; } // note the bool
static inline int is_odd_E(int x) { return x % 2 != 0; } // note the !=
Что это значит? Оптимизатор, как правило, достаточно сложен, чтобы для этих простых вещей самого ясного кода было достаточно, чтобы гарантировать лучшую эффективность .