Яке значення краще використовувати? Логічне значення 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. Але це не питання. Питання в тому, що я запитав.