मुझे आश्चर्य होगा अगर कंपेलरों ने दोनों संस्करणों को एक ही इष्टतम असेंबली में अनुकूलित नहीं किया है। इस माइक्रो-ऑप्टिमाइज़ेशन के साथ अपना समय बर्बाद न करें जबतक कि आप यह साबित नहीं कर सकते कि वे प्रोफाइलर का उपयोग करके महत्वपूर्ण हैं।
अपने प्रश्न का उत्तर देने के लिए: यह अप्रासंगिक है। gcc.godbolt.org पर -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;
}
... संकलित हो जाता है ...
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;
}
... संकलित हो जाता है ...
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
जैसा कि आप देख सकते हैं, अंतर कम है, और volatile
को हटाकर संकलक को अधिक आक्रामक रूप से अनुकूलित करने की अनुमति देने पर अत्यधिक गायब होने की संभावना है।
यहाँ चित्र के रूप में एक समान तुलना, -Ofast -march=native -ffast-math
का उपयोग कर रहा है:
शाखा रहित संस्करण 'x = i - 2 + b;' –
संभावना अधिक है कि यदि आप रिलीज में संकलित करते हैं, तो संकलक उसी कोड को आउटपुट करेगा – user
आप क्यों पूछते हैं? माइक्रो अनुकूलन अपरिवर्तनीय हैं। –