Яке значення краще використовувати? Логічне значення true або ціле число 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: leave 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: leave LCFI6: ret
На диво, g(bool)генерує більше asmінструкцій! Чи означає це, що if(bool)трохи повільніше ніж if(int)? Раніше я думав bool, що спеціально розроблений для використання в умовних операторах, таких як if, тож я очікував g(bool)генерувати менше інструкцій asm, роблячи тим самим g(bool)більш ефективним і швидким.
РЕДАГУВАТИ:
На даний момент я не використовую жодного прапора оптимізації. Але навіть відсутність цього, чому це породжує більше asm для g(bool)- це питання, на яке я шукаю розумну відповідь. Я повинен також сказати вам, що -O2прапор оптимізації генерує точно такий же asm. Але це не питання. Питання в тому, що я запитав.