2013-02-20 12 views
10

सी और सी ++ में, स्थानीय const परिवर्तनीय static बनाने का क्या फायदा है? प्रारंभिक मानते हुए अन्य चर का उपयोग नहीं किया जाता है, क्या कॉल के बीच मूल्य को संरक्षित करने और प्रत्येक कॉल के समान स्थिर मूल्य को सेट करने के बीच कोई अंतर है?सी/सी ++ स्थिर कॉन्स स्थानीय चर का उद्देश्य

क्या एक वैध सी संकलक static को अनदेखा कर सकता है?

सी ++ में, यह कॉल के बीच निर्माण/विनाश से बचाता है, लेकिन क्या कोई अन्य लाभ हो सकता है?

+1

क्या 'कॉन्स्ट' करने के लिए, 'स्थिर', या कोई संशोधक करने के विरोध में? – MathSquared

+0

मैंने अभी सवाल संपादित किया है। मान मानना ​​वास्तव में आधार है। – yukon

+2

आपको यहां जो चाहिए वह आपको मिल सकता है: http://stackoverflow.com/questions/3709207/c-semantics-of-static-const-vs-const – Carl

उत्तर

6

यह स्टैक-स्पेस नहीं ले करता है अगर आप की तरह कुछ है एक लाभ हो सकता है:

static const double table[fairly_large_number] = { .... }; 

जाहिर है, निर्माण की लागत भी काफी है, वहाँ है कि समारोह में बहुत कुछ कहा जाता है यदि पर्याप्त हो सकता है केवल एक बार वस्तु का निर्माण करने में अच्छा मूल्य।

+0

स्टैक स्पेस लेने के बारे में आपका बिंदु समझ में आता है, जब तक कि आपको एहसास न हो कि इसे प्रारंभ किया जाना चाहिए क्योंकि यह 'const' है। कुछ भी जो आप एक स्रोत फ़ाइल में स्थिरांक के रूप में डालने के इच्छुक हैं, शायद आसानी से ढेर पर फिट हो सकता है। –

+0

हम्म, यह सहायक है। एक और छोटा सवाल, एक अस्थिर var पंजीकृत है? – yukon

+0

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

2

हां, और यह बहुत बड़ा है: अर्थपूर्ण लाभ।

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

इसके अलावा, संकलक उस नई जानकारी का लाभ उठा सकता है और उस विशिष्ट प्रकार के आधार पर इसे कुछ स्थितियों में अनुकूलित कर सकता है।

(स्पष्ट होना, मैं यहाँ const के बारे में बनाम non-const, नहीं static बनाम non-static बोल रहा हूँ।)

संपादित: This SO answer भी बहुत जानकारीपूर्ण है।

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