निम्नलिखित कार्य पर विचार करें:
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