El tema anterior me hizo hacer algunos experimentos con bool
y int
en if
condiciones. Así que por curiosidad escribí este programa:
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
genera código ASM para cada función de la siguiente manera:
código asm para
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
código asm para
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
¡Sorprendentemente, g(bool)
genera más asm
instrucciones! ¿Significa que if(bool)
es un poco más lento que if(int)
? Solía pensar que bool
está especialmente diseñado para usarse en declaraciones condicionales como if
, por lo que esperaba g(bool)
generar menos instrucciones ASM, lo que las hace g(bool)
más eficientes y rápidas.
EDITAR:
No estoy usando ningún indicador de optimización a partir de ahora. Pero incluso en su ausencia, ¿por qué genera más asm? g(bool)
Es una pregunta para la que estoy buscando una respuesta razonable. También debería decirte que la -O2
bandera de optimización genera exactamente el mismo asm. Pero esa no es la cuestión. La pregunta es lo que he preguntado.