2012-01-14 14 views
6

के आवंटन मैं एक किताब जो इसभंडारण स्थिरांक चर

उल्लेख संकलक स्थिरांक के हर उपयोग जानता है पढ़ रहा हूँ, यह इसे पकड़ अंतरिक्ष आवंटित की जरूरत नहीं है। उदाहरण के लिए:

  1. const int c1=1;
  2. const int c3=my_f(3);
  3. extern const int c4;

यह देखते हुए कि सी 3 और सी 4 के मूल्यों संकलन समय के रूप में नहीं जाना जाता है, भंडारण सी 3 और सी 4 के लिए आवंटित किया जाना चाहिए।

मैं इस के किसी भी समझ में नहीं आया। मेरे संदेह कर रहे हैं:

क्या इसे यहाँ पकड़ कर क्या मतलब है? क्या इसे अभी भी स्मृति में सबकुछ स्टोर करने की आवश्यकता नहीं है? सी 1 के लिए, हमारे पास कोई भंडारण आवंटन नहीं है?

कृपया मेरे संदेहों को स्पष्ट करें।

धन्यवाद।

+1

'c2' के साथ क्या हुआ? –

उत्तर

4

c1 अन्य दो स्थिरांक से अलग है जिसमें इसे शाब्दिक मूल्य के साथ प्रारंभ किया गया है। इस संकलक कि मूल्य हर जगह डाले जा रहे निरंतर प्रयोग किया जाता है इस तरह, कर सकते हैं:

int x = z + c1; 

इसका मतलब है कि संकलक अंतरिक्ष का आवंटन और उस में 1 स्टोर करने के लिए की जरूरत नहीं है द्वारा

int x = z + 1; 

बदला जा सकता है।

c3 और c4 अलग हैं: किसी को फ़ंक्शन का उपयोग करके गणना की जाती है, और दूसरा एक अलग संकलन इकाई से आपूर्ति की जाती है। इसका मतलब है कि संकलक अब प्रतिस्थापन c1 साथ जिस तरह से यह कर सकता है प्रदर्शन कर सकते हैं: c3 और c4 के मूल्यों संकलक करने के लिए नहीं जाना जाता है। इसलिए संकलक के रूप में अगर c4 एक चर स्मृति में कुछ जगह में संग्रहीत किया गया उसी तरह से के लिए

int x = z + c4; 

कोड उत्पन्न करता है। के बाद से इस मामले में c4 एक बाहरी स्थिर है, लिंकर अपने स्थान का समाधान हो जाएगा, और जानकारी संकलक याद आ रही है में भरने (यानी, c4 का पता) कार्यक्रम को पूरा करने और चलाने के लिए तैयार करते हैं।

+0

उत्तर देने के लिए धन्यवाद लेकिन इसका मतलब यह है कि जब भी एक चर को एक कक्ष के रूप में परिभाषित किया जाता है और एक शाब्दिक के साथ प्रारंभ किया जाता है, तो यह एक मैक्रो की तरह कार्य करता है और जहां भी प्रोग्राम में कंपाइलर का उपयोग किया जाता है, वैरिएबल वैरिएबल को वैल्यू के साथ बदल देता है? –

+1

@Leoheart संकलक * प्रतिस्थापन * उस प्रतिस्थापन करने के लिए है, और अधिकांश संकलक इसे करते हैं। लेकिन जहां तक ​​मुझे पता है, कंपेलरों को घोषित स्थिरांक "इनलाइन" करने की आवश्यकता नहीं है: मानक उन्हें किसी भी तरह से करने की अनुमति देता है।इसके अलावा, आप एक घोषित निरंतर के एक पते लेने के लिए अनुमति दी जाती है जो मामले में स्मृति में संकलक स्थानों यह अलावा स्थानों पर जहां यह प्रयोग किया जाता है पर यह इनलाइन करने के लिए। – dasblinkenlight

+0

समझ गया। धन्यवाद। –

1

एक अभिन्न लगातार अभिव्यक्ति के रूप में, संकलक कार्यक्रम से निकालने के लिए निरंतर तह उपयोग करने के लिए हर अधिकार है। यह केवल तभी सच नहीं है जब आप इसका पता लेते हैं। इसके अलावा, एक आधुनिक अनुकूलन संकलक सीटी और सी 4 के साथ ऐसा करने के लिए एलटीओ, इनलाइनिंग और निरंतर फोल्डिंग को नियोजित कर सकता है, यदि यह संभव हो।

आप एक चर के पते नहीं लेते हैं, संकलक, यह आवंटित करने के लिए के रूप में करता है, तो नियम के तहत अगर यह बराबर परिणामों के साथ कोड उत्पन्न कर सकते हैं कोई दायित्व नहीं है।

संपादित करें: लगातार फोल्डिंग वह है जहां संकलक रन-टाइम के बजाय संकलन-समय पर अभिव्यक्तियों का मूल्यांकन करता है। उदाहरण के लिए, आप कानूनी रूप से int x[3 + 4]; कर सकते हैं जहां संकलन-समय पर 3 + 4 का मूल्यांकन किया जाता है। कुछ उदाहरण, विशेष रूप से आईसीई से जुड़े, मानक अनिवार्य हैं, लेकिन यदि संभव हो तो कार्यान्वयन अधिक प्रदर्शन कर सकता है। एलटीओ लिंक टाइम ऑप्टिमाइज़ेशन है, जहां संकलक एक साथ जुड़े हुए हैं, जब संकलक अनुवाद इकाइयों में अनुकूलन करता है।

इसका मतलब है कि संकलक शरीर my_f की लगातार (शरीर के आधार पर) लगातार गुना यह जहाँ भी यह प्रयोग किया जाता है में इनलाइन कर सकते हैं, और फिर इसे बाहर गुना c3 एक निरंतर अभिव्यक्ति बनाने के लिए, और फिर और इसे आवंटित नहीं। c4 के लिए, एलटीओ निरंतर अभिव्यक्ति के रूप में c4 का मान उत्पन्न कर सकता है, इस स्थिति में इसे लगातार फोल्ड और हटाया जा सकता है।

सी ++ में constexpr फ़ंक्शंस हैं जो इस क्षेत्र में और अधिक करने की अनुमति देते हैं।

+0

मुझे खेद है, मैं भी आपका जवाब समझने में सक्षम नहीं हूं। निरंतर तह और एलटीओ क्या है? –

+0

समझ गया। धन्यवाद। –

+0

एक अंतिम सवाल: इसका मतलब यह है कि जब भी एक चर एक स्थिरांक के रूप में परिभाषित और एक शाब्दिक साथ प्रारंभ, यह एक मैक्रो की तरह काम करता है और कार्यक्रम में जहाँ भी संकलक justs मूल्य के साथ चर की जगह प्रयोग किया जाता है? –

2

कॉन्स में 2 उपयोग हैं - मैक्रोज़ (निरंतर अभिव्यक्ति) और अपरिवर्तनीय डेटा के लिए प्रतिस्थापन।

यह बयान:

const int c1=1; 

अनिवार्य रूप से इस का एक प्रकार के लिए सुरक्षित संस्करण:

#define c1 1 

इस तरह की है कि इस कोड:

int foo = c1; 

बस के रूप में संकलित किया जा सका:

int foo = 1; 

जो अधिक कुशल है।

दूसरी ओर, इस:

const int c3=my_f(3); 

अपरिवर्तनीय सी 3 के रूप में इस्तेमाल किया जा रहा है। यह स्मृति में मौजूद है, लेकिन आप इसे संशोधित नहीं कर सकते हैं। यह अनिवार्य रूप से int c3=my_f(3); का एक सुरक्षित संस्करण है।

इसे दर्शाने के लिए:

int a1[c1]; 
int a2[c3]; 

a1 मान्य है, के रूप में संकलक a1 अनुमान एक निरंतर अभिव्यक्ति हो सकता है। ए 2 नहीं है, जबकि सी 3 कॉन्स है, यह संकलन समय पर ज्ञात नहीं हो सकता है।

सी ++ 11, constexpr कीवर्ड जो const के समान है कहते हैं, हालांकि const से ज्यादा सख्त है। केवल c1 और c2constexpr हो सकता है। c3 भी हो सकता है, हालांकि इसकी आवश्यकता होगी कि my_f भी है।

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