2008-09-18 20 views
9

जब कोई वैरिएबल स्टोरेज क्लास विनिर्देशक के बारे में बात करता है, तो वे किस बारे में बात कर रहे हैं?
वे अक्सर एक ही संदर्भ में परिवर्तनीय संबंध के बारे में बात करते हैं, वह क्या है?एक चर के लिंक और भंडारण विनिर्देशक क्या है?

उत्तर

28

भंडारण वर्ग विनिर्देशक भंडारण और अपने चर के लिंकेज नियंत्रित करता है। ये दो अवधारणाएं हैं जो अलग हैं। सी चर के लिए निम्नलिखित विनिर्देश निर्दिष्ट करता है: ऑटो, बाहरी, रजिस्टर, स्थैतिक।

भंडारण
भंडारण अवधि निर्धारित करता है कितनी देर तक अपने चर राम में रहते हैं।
भंडारण अवधि के तीन प्रकार हैं: स्थैतिक, स्वचालित और गतिशील।

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

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

गतिशील
आप (सी में या नए ++) malloc का उपयोग करते हैं आप गतिशील भंडारण का उपयोग कर रहे हैं। यह संग्रहण तब तक अस्तित्व में रहेगा जब तक कि आप निशुल्क कॉल न करें (या हटाएं)। स्टोरेज बनाने का यह सबसे महंगा तरीका है, क्योंकि सिस्टम को आवंटन और गतिशीलता को गतिशील रूप से प्रबंधित करना होगा।

लिंकेज
लिंकेज निर्दिष्ट करता है जो देख सकते हैं और चर संदर्भित कर सकते हैं। तीन प्रकार के संबंध हैं: आंतरिक संबंध, बाहरी संबंध और कोई संबंध नहीं।

कोई लिंक
यह चर केवल यह दिखाई देता है जहां इसे घोषित किया गया था। आमतौर पर फ़ंक्शन में घोषित चर पर लागू होता है।

आंतरिक संबंध
यह चर फ़ाइल (एक translation unit कहा जाता है) के भीतर सभी कार्यों को दिखाई देगी,, लेकिन अन्य फ़ाइलों को पता नहीं चलेगा कि यह मौजूद है।

बाहरी लिंक
परिवर्तनीय अन्य अनुवाद इकाइयों के लिए दृश्यमान होगा। इन्हें अक्सर "वैश्विक चर" के रूप में माना जाता है।

यहाँ विनिर्देशक

 
    Storage Class Function   File 
    Specifier  Scope    Scope 
----------------------------------------------------- 
    none   automatic   static  
       no linkage  external linkage 

extern   static   static 
       external linkage external linkage 

static   static   static 
       no linkage  internal linkage 

    auto   automatic   invalid 
       no linkage 

register   automatic   invalid 
       no linkage 
+1

शायद अनुवाद इकाइयों पर अतिरिक्त विवरण शामिल होना चाहिए क्योंकि वे केवल फाइल नहीं हैं ... वे स्रोत फाइलें हैं और उनमें से कोई भी शीर्षलेख शामिल है (हालांकि अप्रत्यक्ष रूप से) – workmad3

+1

वाह ... +1। ध्यान दें कि "ऑटो" इसका अर्थ सी ++ 0x के साथ बदल देगा: http://en.wikipedia.org/wiki/C%2B%2B0x – paercebal

+0

सी ++ 11: थ्रेड स्टोरेज अवधि के लिए अद्यतन। थ्रेड समाप्त होने पर धागा शुरू होता है और हटा दिया जाता है जब ऑब्जेक्ट आवंटित किया जाता है। प्रत्येक धागे का ऑब्जेक्ट का अपना उदाहरण होता है। थ्रेड_लोकल घोषित केवल ऑब्जेक्ट्स में यह स्टोरेज अवधि है। thread_local लिंक समायोजित करने के लिए स्थिर या बाहरी के साथ एक साथ दिखाई दे सकता है। – czxyl

0

चर भंडारण वर्ग या प्रकार विनिर्देशक के आधार पर भंडारण और लिंकेज विशेषताओं को परिभाषित कैसे/जहां चर प्रोग्राम निष्पादन के दौरान सहेजे गए हैं (वाष्पशील, ऑटो और स्थिर की तरह) का वर्णन एक टेबल है। उदाहरण के लिए, फ़ंक्शंस में परिभाषित चर आमतौर पर स्टैक पर सहेजे जाते हैं, जिसका अर्थ यह है कि फ़ंक्शन रिटर्न के बाद यह खो जाएगा। "स्थिर" कीवर्ड का उपयोग करके, आप संकलक को डेटा सेगमेंट में वैरिएबल को मेमोरी में रखने के लिए मजबूर कर सकते हैं, जिससे उस फ़ंक्शन पर कॉल के बीच चर सामग्री लगातार बनायी जा सके। "रजिस्टर" कीवर्ड संकलक को सीपीयू रजिस्टर में वैरिएबल डालने के लिए यथासंभव कठिन प्रयास करने का कारण बनता है, काउंटर में काउंटर के लिए उपयोगी आदि। हालांकि, यह गारंटी नहीं है कि यह वास्तव में एक रजिस्टर में है।

टाइप विनिर्देशों here के बारे में और पढ़ें।

+0

"जितना संभव हो उतना कठिन प्रयास करें" की एक अजीब परिभाषा के लिए जिसका अर्थ है "कुछ भी नहीं करें"। दस्तावेज (प्रवर्तन द्वारा) को छोड़कर 'रजिस्टर' पूरी तरह से अप्रचलित है कि आपके कोड को चर के पते को लेने की अनुमति नहीं है। –

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