Derleyiciler her iki sürümü de aynı en iyi düzene göre optimize etmemişlerse şaşırırım. Bir profiler kullanarak anlamlı olduklarını kanıtlayamazsanız, zamanınızı bu mikro optimizasyonlarla boşa harcamayın.
Sorunuzu yanıtlamak için: alakasız. İşte -Ofast
ile gcc.godbolt.org üzerinde "oluşturulan montaj" karşılaştırması. için derlenmiş
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;
}
... ... ... üzere
volatile int state1;
volatile void f1(volatile int i, volatile bool b)
{
int x = i-1;
if(!b)x--;
state1 = x;
}
...
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
derlenmiş
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
Gördüğünüz gibi, fark minimumdur ve derleyicinin volatile
'u kaldırarak daha agresif bir şekilde optimize edilmesine izin verildiğinde ortadan kaybolması oldukça olasıdır.
İşte -Ofast -march=native -ffast-math
kullanarak resim şeklinde benzer bir karşılaştırma verilmiştir: iyileştirici muhtemelen, aynı çözüme hem çözümlerini optimize edecek beri

\ n "x = i - 2 + b; –
" unun değeri yüksektir. Sürümde derleme yaparsanız, derleyici aynı kodu – user
neden çıktı? Neden soruyorsunuz? Mikro optimizasyonlar gereksizdir. –