O tópico acima me fez fazer alguns experimentos com bool
e int
em if
condições. Então, apenas por curiosidade, escrevi 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
gera código ASM para cada função da seguinte maneira:
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
Surpreendentemente, g(bool)
gera mais asm
instruções! Isso significa que if(bool)
é um pouco mais lento do que if(int)
? Eu costumava pensar que bool
era especialmente projetado para ser usado em instruções condicionais como if
, portanto, esperava g(bool)
gerar menos instruções asm, tornando-as g(bool)
mais eficientes e rápidas.
EDITAR:
Não estou usando nenhum sinalizador de otimização no momento. Mas mesmo a ausência dela, por que gera mais g(bool)
questionamento? É uma questão para a qual estou procurando uma resposta razoável. Devo também dizer que o -O2
sinalizador de otimização gera exatamente o mesmo asm. Mas essa não é a questão. A questão é o que eu perguntei.
g(bool)
questionamento? É uma questão para a qual procuro uma resposta razoável.