2010-01-21 12 views
9

मैंने कुछ कोड देखा है जिसमें मूल्य द्वारा फ़ंक्शन को पास किए गए तर्क संशोधित किए जा रहे थे या एक नया मान असाइन किया गया था और स्थानीय चर की तरह उपयोग किया जा रहा था ।फ़ंक्शन के अंदर 'मूल्य से पारित तर्क' को संशोधित करना और उन्हें स्थानीय चर के रूप में उपयोग करना

क्या यह करने के लिए एक अच्छी बात है? क्या ऐसा करने में कोई समस्या है या क्या यह इस तरह कोड करने के लिए ठीक है?

उत्तर

7

अनिवार्य रूप से, फ़ंक्शन का पैरामीटर एक स्थानीय चर है, इसलिए यह अभ्यास सिद्धांत रूप में खराब नहीं है।

दूसरी ओर, ऐसा करने से रखरखाव के सिरदर्द हो सकते हैं। यदि कोई अन्य प्रोग्रामर बाद में आता है, तो हो सकता है कि वह चर के मूल्य को पास करने की अपेक्षा कर सके, और परिवर्तन एक बग का कारण बन जाएगा।

चर का पुन: उपयोग करने के लिए एक औचित्य स्मृति उपयोग की दक्षता की एक गुमराह धारणा के लिए है। दरअसल, यह दक्षता में सुधार नहीं कर सकता है, और इसे कम कर सकता है। इसका कारण यह है कि संकलक स्वचालित रूप से पता लगा सकता है कि दो अलग-अलग चरों के लिए दो अलग-अलग चरों के लिए एक ही रजिस्टर का उपयोग करना उपयोगी है, और यदि यह बेहतर होता है तो यह करेगा। लेकिन प्रोग्रामर को संकलक के लिए यह निर्णय नहीं लेना चाहिए। इससे संकलक को चुनने वाले विकल्पों को सीमित कर दिया जाएगा।

सबसे सुरक्षित अभ्यास एक नए चर का उपयोग करना है यदि इसे एक नए मान की आवश्यकता है, और इसे कुशल बनाने के लिए संकलक पर भरोसा करें।

+4

कंपाइलर के परिप्रेक्ष्य से, मौजूदा चर के लिए प्रत्येक असाइनमेंट को एक नए चर के रूप में माना जा सकता है। तो संकलक कोड को उतना ही कुशल बना सकता है कि प्रोग्रामर ने एक नया चर बनाया है या नहीं। वास्तव में, अधिकांश माइक्रोआर्किटेक्चर के पास फिर से नामकरण रजिस्टर होता है, इसलिए कंपाइलर को परेशान भी नहीं होता है। –

2

कोई समस्या नहीं है जो मैं सोच सकता हूं। तर्कों को या तो मौजूदा स्टैक फ्रेम में या किसी अन्य स्थानीय चर की तरह रजिस्टरों में रखा जाएगा। सुनिश्चित करें कि तर्क मूल्य से पारित किए जाते हैं, हालांकि। विशेष रूप से, सरणी संदर्भ द्वारा पारित कर रहे हैं।

+0

मुझे यह भी लगता है कि अस्थायी चर के रूप में मूल्य द्वारा पारित तर्कों का उपयोग करने के लिए यह बिल्कुल ठीक है और उन्हें संशोधित करें: कम से कम आप कुछ स्टैक स्पेस को सहेज रहे हैं (यदि ढेर उन्हें पकड़ने के लिए उपयोग किया जाता है); मैंने सी ++ पुस्तक में अपने उदाहरण कोड में इस तरह से स्ट्रॉस्ट्रप को भी देखा है। – cforfun

संबंधित मुद्दे