2013-06-09 5 views
22

सी मानक गारंटी देता है कि वैश्विक और स्थैतिक चर, यदि प्रारंभ नहीं किया गया है, तो हमेशा 0 होते हैं।प्रारंभिक वैश्विक और स्थिर चर 0 से हमेशा अनावश्यक है?

यहां मेरा प्रश्न है: गैर-प्रारंभिक वैश्विक और स्थैतिक चर कार्यक्रम में BSS सेगमेंट पर जाते हैं। तो तथाकथित 0all-bit 0 होना चाहिए।

अभिन्न चर के लिए, all-bit 0 का मूल्यांकन 0 के रूप में किया जाएगा। फ्लोटिंग पॉइंट वेरिएबल्स, यदि आईईईई 754 का पालन करते हैं, तो 0.0 भी है।

int *p; 
+4

यहां कुछ अच्छी जानकारी दी गई है: http://en.cppreference.com/w/cpp/language/zero_initialization –

+2

यह 'p'' के मूल्य के बारे में कोई टिप्पणी नहीं है। यह एक कोडिंग शैली विचार है। जब आप 'int * p' का उपयोग करते हैं, तो यह प्रारंभ करने के लिए प्रारंभ करने की आवश्यकता पर बल देने में विफल रहता है। यह सुझाव देता है कि प्रारंभिक मूल्य एक देखभाल नहीं है, भले ही इसे 'सी' द्वारा' NULL' में प्रारंभ किया गया हो। 'int * p = NULL; 'उस प्रारंभिकरण के लिए प्रोग्राम _needs_ का तात्पर्य है। यही अंतर मैं देखता हूं। – chux

उत्तर

18

मानक गारंटी देता है कि के साथ एक सूचक:

int* p = NULL; 

कोई फर्क सिर्फ करने के लिए कर: लेकिन संकेत के लिए, अशक्त संकेत जरूरी नहीं कि all-bit 0 है, इसलिए इस तरह एक वैश्विक सूचक का प्रारंभ करता है स्थैतिक भंडारण अवधि और कोई अन्य प्रारंभकर्ता एक शून्य सूचक होने के लिए शुरू किया जाएगा, भले ही इसमें थोड़ा सा पैटर्न शामिल हो।

वही मूल विचार फ़्लोटिंग पॉइंट और पूर्णांक प्रकारों पर भी लागू होता है - उन्हें 0 या 0.0 तक भी आरंभ करने की गारंटी है। कार्यान्वयन इस तथ्य को छोड़ सकता है कि बीएसएस सभी बिट्स को 0 पर सेट करता है अगर केवल अगर यह "जानता है" तो ऐसा करने से सही मूल्य होंगे।

+0

ताकि गैर-प्रारंभिक चर को बीएसएस में जाना न पड़े, यह मेरी समस्या बताता है, धन्यवाद। –

+2

@YuHao: सबसे पहले, मुझे पूरा यकीन है कि मानक वास्तव में निर्दिष्ट नहीं करता है कि WHERE चर चलते हैं। जब तक वे लक्ष्य प्रणाली की याद में कहीं भी दिखाई देते हैं, यह ठीक है। मेमोरी का वह टुकड़ा जिसे "डेटा", "बीएसएस" या "ह्हाहा" कहा जा सकता है, उसके लिए यह परवाह करता है। हालांकि, यह परिभाषित करता है कि वैश्विक और स्थैतिक चर को एक निश्चित तरीके से शुरू किया जाना चाहिए, इसलिए कार्यान्वयन को "जो कुछ भी लगता है" करना है - जो इसे बस बीएसएस में छोड़ सकता है और ओएस को शून्य पर सेट करने देता है, या यह शून्य के अलावा कुछ अन्य स्थानों के साथ कुछ स्थानों को भरने के लिए कुछ कोड की आवश्यकता हो सकती है। –

+0

@Yu हाओ: इससे कोई फर्क नहीं पड़ता कि यह "बीएसएस में जाता है" या नहीं। कंपाइलर हमेशा स्टार्टअप प्रारंभिक कोड उत्पन्न कर सकता है जो "बीएसएस में होने" के किसी भी प्रभाव को ओवरराइड करेगा। तो, बीएसएस पूरी तरह से अपरिहार्य है। – AnT

9

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

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

यह फ़्लोटिंग-पॉइंट मानों पर लागू होगा, उदाहरण के लिए, यदि कुछ प्लेटफॉर्म 0.0 (सी को आईईईई 754 को जरूरी नहीं है) के प्रतिनिधित्व के लिए गैर-शून्य बिट पैटर्न वाले गैर मानों के लिए गैर-आईईईई 754 प्रतिनिधित्व का उपयोग किया जाता है।

(इसके अलावा, यह char से बड़े सभी अभिन्न प्रकारों पर भी लागू होता है, जब तक कि सी 99 मानक के लिए टीसी में से एक को अंततः सभी प्रकार के पूर्णांक शून्य के लिए एक वैध ऑब्जेक्ट प्रतिनिधित्व के लिए सभी बिट्स-शून्य पैटर्न की आवश्यकता नहीं होती सी प्लेटफार्म।)

एक अच्छा असली जीवन उदाहरण सी ++ (एक अलग भाषा लेकिन इस मामले में प्रासंगिक) से आता है। सी ++ स्थिर भंडारण अवधि के साथ स्केलर चर के लिए एक ही गारंटी देता है। इस बीच, कई लोकप्रिय सी ++ कार्यान्वयन 0xFFFFFFFF मान का उपयोग पॉइंटर-टू-डेटा-सदस्य प्रकार के नल पॉइंटर्स का प्रतिनिधित्व करने के लिए करते हैं। जैसे

SomeType SomeClass::*p = 0; 

वास्तव में कोड है कि सभी बिट-एक पैटर्न के साथ p भरता में तब्दील हो। इसलिए, यदि आप एक स्पष्ट प्रारंभकर्ता के बिना इस प्रकार के स्थिर चर घोषित करते हैं, तो संकलक को यह सुनिश्चित करना होगा कि उसका प्रारंभिक मान सभी बिट्स-एक पैटर्न है, न कि सभी बिट्स-शून्य पैटर्न। कुछ कंपाइलर्स बीएसएस में ऐसे चर डालने से गलत होने के लिए जाने जाते हैं, उनके बारे में भूल रहे हैं, इस प्रकार सभी बिट्स-शून्य पैटर्न से भरे ऐसे चर छोड़ रहे हैं।

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