निम्नलिखित कार्य पर विचार करें:
void func(bool& flag)
{
if(!flag) flag=true;
}
यह मुझे लगता है कि यदि ध्वज का एक वैध बूलियन मूल्य है, तो यह इस true
तरह से बिना शर्त सेटिंग के बराबर होगा :
void func(bool& flag)
{
flag=true;
}
फिर भी न तो जीसीसी और न ही क्लैग इसे इस तरह से अनुकूलित करते हैं - दोनों -O3
अनुकूलन स्तर पर निम्नलिखित उत्पन्न करते हैं :
_Z4funcRb:
.LFB0:
.cfi_startproc
cmp BYTE PTR [rdi], 0
jne .L1
mov BYTE PTR [rdi], 1
.L1:
rep ret
मेरा प्रश्न यह है: क्या यह सिर्फ इतना है कि कोड का अनुकूलन करने के लिए देखभाल करने के लिए बहुत विशेष-मामला है, या क्या कोई अच्छा कारण है कि इस तरह के अनुकूलन को अवांछित क्यों किया जाएगा, यह देखते हुए कि flag
कोई संदर्भ नहीं है volatile
? यह एकमात्र कारण लगता है जो हो सकता है कि flag
यह किसी भी तरह का गैर- true
या- false
मान हो सकता है , इसे पढ़ने के बिंदु पर अपरिभाषित व्यवहार के बिना, लेकिन मुझे यकीन नहीं है कि यह संभव है।
1
इस्तेमाल किया जा रहा है। Godbolt.org/g/swe0tc