2011-06-17 22 views

उत्तर

38

यह आपके सिस्टम पर निर्भर करता है, और आप चर का उपयोग कैसे करते हैं। static चर के लिए:

केस 1: आप चर का कभी भी उपयोग नहीं करते हैं, और संकलक चुपचाप इसे छोड़ देता है। यह extern चर के साथ नहीं हो सकता है।

केस 2: आप चर का उपयोग करते हैं, लेकिन आप इसका पता कभी नहीं लेते। कंपाइलर चर के उपयोग को तत्काल ऑपरेटरों में परिवर्तित करता है, जैसे कि यह #define या enum था। कंपाइलर अभी भी extern स्थिर को तत्काल संचालन में परिवर्तित कर सकता है, लेकिन इसे अभी भी इसके लिए एक पता होना चाहिए।

केस 3: आप चर का उपयोग और उसका पता लेते हैं, संकलक वस्तु कोड में यह डाल करने के लिए, बिल्कुल के रूप में अगर यह extern थे एक जगह खोजने के लिए मजबूर किया जाता है।

"डेटा" बनाम "प्रोग्राम" मेमोरी के लिए, ठीक है, यह आपके द्वारा उपयोग की जा रही प्रणाली के लिए बहुत विशिष्ट है। मेरे लिनक्स x64/ईएलएफ सिस्टम पर, इसे शायद .rodata सेक्शन में रखा जाएगा, जो कोड (.text) के समान सेगमेंट में जाता है, लेकिन रीड-राइट डेटा सेक्शन (.bss, .data) से एक अलग सेगमेंट है। मेरा सिस्टम केवल पढ़ने योग्य गैर निष्पादन योग्य डेटा के लिए एक अलग सेगमेंट नहीं बनाना प्रतीत होता है।

Addendum: ध्यान दें कि व्यवहार C++ में भिन्न है। सी ++ में, const वैरिएबल में डिफ़ॉल्ट रूप से आंतरिक संबंध होता है, इसलिए static const अनावश्यक है और बाहरी लिंकेज के साथ स्थिरता प्राप्त करने के लिए extern const आवश्यक है।

5

डाइट्रिच ने पहले ही static चर के मामले को समझाया है।

स्थानीय चर के लिए संकलक कार्यान्वयन में const योग्य चर के आवंटन के लिए कई विकल्प हैं जहां पता लिया जाता है। यह ढेर या स्थिर स्मृति में आवंटित किया जा सकता है या नहीं। यह विशेष रूप से const योग्य यौगिक अक्षर के मामले में है। ऐसे दो अक्षरों के पते जिन्हें स्थानीय रूप से अलग-अलग क्षेत्रों में घोषित किया जा सकता है, उन्हें एक में तब्दील किया जा सकता है और उनके पते बराबर तुलना कर सकते हैं।

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