Której wartości lepiej użyć? Wartość logiczna prawda czy liczba całkowita 1?
Powyższy temat mnie zrobić kilka eksperymentów z bool
i int
w if
stanie. Tak więc z ciekawości napisałem ten program:
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
generuje kod asm dla każdej funkcji w następujący sposób:
kod asm dla
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
kod asm dla
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
O dziwo, g(bool)
generuje więcej asm
instrukcji! Czy to znaczy, że if(bool)
jest trochę wolniejsze niż if(int)
? Kiedyś uważałem, że bool
jest specjalnie zaprojektowany do użycia w instrukcjach warunkowych, takich jak if
, więc spodziewałem g(bool)
się wygenerować mniej instrukcji asm, dzięki czemu będę g(bool)
bardziej wydajny i szybki.
EDYTOWAĆ:
Na razie nie używam żadnej flagi optymalizacji. Ale nawet jego brak, dlaczego generuje więcej asm, g(bool)
jest pytaniem, na które szukam rozsądnej odpowiedzi. Powinienem też powiedzieć, że -O2
flaga optymalizacji generuje dokładnie to samo co m. Ale to nie jest pytanie. Pytanie brzmi, o co zadałem.