Byłbym zaskoczony, gdyby kompilatory nie zoptymalizowały obu wersji do tego samego optymalnego zespołu. Nie marnuj czasu dzięki tym mikrooptymalizacjom, chyba że udowodnisz, że są istotne przy użyciu profilera.
Aby odpowiedzieć na pytanie: nie ma to znaczenia. Oto porównanie "generowanego zestawu" na stronie gcc.godbolt.org z -Ofast
.
volatile int state0;
volatile void f0(volatile int i, volatile bool b)
{
int x;
if(b)x = i-1;else x = i-2;
state0 = x;
}
... pobiera skompilowany do ...
f0(int, bool): # @f0(int, bool)
mov dword ptr [rsp - 4], edi
mov byte ptr [rsp - 5], sil
movzx eax, byte ptr [rsp - 5]
or eax, -2
add eax, dword ptr [rsp - 4]
mov dword ptr [rip + state0], eax
ret
volatile int state1;
volatile void f1(volatile int i, volatile bool b)
{
int x = i-1;
if(!b)x--;
state1 = x;
}
... pobiera skompilowany do ...
f1(int, bool): # @f1(int, bool)
mov dword ptr [rsp - 4], edi
mov byte ptr [rsp - 5], sil
mov eax, dword ptr [rsp - 4]
movzx ecx, byte ptr [rsp - 5]
or ecx, -2
add ecx, eax
mov dword ptr [rip + state1], ecx
ret
Jak widać, różnica jest minimalna i bardzo prawdopodobne, że zniknie, gdy kompilator może zoptymalizować bardziej agresywnie, usuwając volatile
.
Oto podobne porównanie w formie graficznej, korzystając -Ofast -march=native -ffast-math
:
Wersja bez branchless to 'x = i - 2 + b;' –
Istnieje duża szansa, że jeśli skompilujesz w wydaniu, kompilator wypisze ten sam kod w dowolny sposób – user
Dlaczego pytasz? Mikro optymalizacje są nieważne. –