क्या सी ++ में यह घोषणा करने का कोई तरीका है कि किसी फ़ंक्शन का दुष्प्रभाव नहीं है? पर विचार करें:सी ++: कोई साइड इफेक्ट्स के साथ फ़ंक्शन अनुकूलित करना
LOG("message").SetCategory(GetCategory());
अब रिलीज में लॉग मैक्रो बनाता है एक NullLogEntry उद्देश्य यह है कि SetCategory है() एक खाली समारोह के रूप में परिभाषित बनाता है कि लगता है। तो मूल रूप से पूरी अभिव्यक्ति को अनुकूलित किया जा सकता है (और चाहिए) को दूर किया जा सकता है - सिद्धांत रूप में, GetCategory() कॉल के कुछ दुष्प्रभाव हो सकते हैं, इसलिए मुझे लगता है कि संकलक को इसे फेंकने की अनुमति नहीं है।
एक और उदाहरण एक फ़ंक्शन टेम्पलेट विशेषज्ञता हो सकता है जो इसके कुछ तर्कों को अनदेखा करता है, फिर भी संकलक को संभव साइड इफेक्ट्स के कारण कॉल साइट पर ऐसे तर्कों के मूल्यांकन को सहेजने की अनुमति नहीं है।
क्या मैं सही हूँ? या फिर संकलक इस तरह के कॉल को अनुकूलित कर सकते हैं? यदि नहीं, तो क्या संकलक को संकेत देने का कोई तरीका है कि इस फ़ंक्शन का कोई साइड इफेक्ट नहीं है, इसलिए यदि वापसी मान को अनदेखा किया जाता है तो पूरी कॉल छोड़ी जा सकती है?
जब तक कि फ़ंक्शन इनलाइन होने के लिए पर्याप्त छोटा हो, तब तक बाधाएं बहुत अच्छी होती हैं कि सभी कोड को अनुकूलित किया जाता है।जाहिर है यह एक कार्यान्वयन विस्तार है जिसे आपको अपने लिए सत्यापित करना होगा। –
मूल रूप से अनुकूलक के दौरान किसी भी * अर्थपूर्ण * परिवर्तन करने की अनुमति नहीं है। फ़ंक्शन कॉल को निकालना एक अर्थपूर्ण परिवर्तन है। चूंकि आप संकलक को स्पष्ट रूप से नहीं बता सकते हैं "इस फ़ंक्शन का कोई साइड इफेक्ट नहीं है", यह अनुकूलित नहीं होगा। –
@Cicada: कुछ सी ++ कंपाइलर्स गुणों को परिभाषित करते हैं (जैसे 'शुद्ध') जो आपको संकलक को बताते हैं कि फ़ंक्शन का कोई साइड इफेक्ट नहीं है, जिससे सिद्धांत में, इसके परिणाम कैश हो सकते हैं/इसकी कॉल अनुकूलित कर सकते हैं। –