Hangi değeri kullanmak daha iyidir? Boolean doğru mu, Tamsayı 1 mi?
Yukarıdaki başlık bana bazı deneyler yaptırdı bool
ve int
içinde if
koşulu. Ben de meraktan bu programı yazdım:
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
aşağıdaki gibi her işlev için asm kodu üretir:
asm kodu
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 kodu
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
Şaşırtıcı bir şekilde, g(bool)
daha fazla asm
talimat üretir ! Bundan if(bool)
biraz daha yavaş olduğu anlamına mı geliyor if(int)
? Eskiden bool
özellikle koşullu ifadelerde kullanılmak üzere tasarlandığını düşünürdüm if
, bu nedenle g(bool)
daha az asm komutu üretmeyi bekliyordum , böylece g(bool)
daha verimli ve hızlı hale getirmeyi bekliyordum .
DÜZENLE:
Şu an için herhangi bir optimizasyon bayrağı kullanmıyorum. Ama yokluğu bile, neden daha fazla asm üretiyor, çünkü g(bool)
mantıklı bir cevap aradığım bir soru. Ayrıca -O2
optimizasyon bayrağının tamamen aynı asm ürettiğini söylemeliyim . Ama soru bu değil. Soru sorduğum şey.