El tema anterior me hizo hacer algunos experimentos con booly inten ifcondiciones. 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: retcó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 asminstrucciones! ¿Significa que if(bool)es un poco más lento que if(int)? Solía pensar que boolestá 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 -O2bandera de optimización genera exactamente el mismo asm. Pero esa no es la cuestión. La pregunta es lo que he preguntado.