Какое значение лучше использовать? Boolean true или Integer 1?
Вышеупомянутая тема заставила меня провести несколько экспериментов с
bool
иint
в условииif
. Поэтому просто из любопытства я написал эту программу:int f(int i) { if ( i ) return 99; //if(int) else return -99; } int g(bool b) { if ( b ) return 99; //if(bool) else return -99; } int main(){}
g ++ intbool.cpp -S
генерирует asm-код для каждой функции следующим образом:
asm-код для
f (int)
__ Z1fi: LFB0: pushl% ebp LCFI0: movl% esp,% ebp LCFI1: cmpl $ 0, 8 (% ebp) je L2 movl $ 99,% eax jmp L3 L2: movl $ -99,% eax L3: Покидать LCFI2: Ret
asm-код для
g (bool)
__ Z1gb: LFB1: pushl% ebp LCFI3: movl% esp,% ebp LCFI4: subl $ 4,% esp LCFI5: movl 8 (% ebp),% eax movb% al, -4 (% ebp) cmpb $ 0, -4 (% ebp) je L5 movl $ 99,% eax jmp L6 L5: movl $ -99,% eax L6: Покидать LCFI6: Ret
Удивительно, но
g (bool)
генерирует больше инструкцийasm
! Означает ли это, чтоif (bool)
немного медленнее, чемif (int)
? Раньше я думал, чтоbool
специально разработан для использования в условных операторах, таких какif
, поэтому я ожидал, чтоg (bool)
будет генерировать меньше инструкций asm, тем самым делаяg (bool)
более эффективным и быстрым.РЕДАКТИРОВАТЬ:
На данный момент я не использую никаких флагов оптимизации. Но даже при его отсутствии, почему он генерирует больше asm для
g (bool)
- это вопрос, на который я ищу разумный ответ. Я также должен вам сказать, что флаг оптимизации-O2
генерирует точно такой же asm. Но вопрос не в этом. Вопрос в том, что я задал.