यह निर्भर करता है।
int a = 5;
यह एक "स्थिर" प्रारंभ (जो जब कार्यक्रम पाठ और डेटा चल रहा से पहले भरी हुई है तब होता है) है: अपने कार्यक्रम में कई स्थिरांक है। मान a
द्वारा आरक्षित स्मृति में संग्रहीत है जो एक पठन-लेखन डेटा "प्रोग्राम खंड" में है। अगर कुछ a
बदलता है, तो मान 5 खो जाता है।
int b=5;
यह सीमित दायरे (केवल main()
द्वारा) के साथ एक स्थानीय चर रहा है। भंडारण एक सीपीयू रजिस्टर या ढेर पर एक स्थान हो सकता है। सबसे आर्किटेक्चर के लिए उत्पन्न निर्देश, "तत्काल डेटा" के रूप में एक निर्देश में मूल्य 5 स्थापित करेंगे एक x86 उदाहरण के लिए:
mov eax, 5
निर्देश के लिए क्षमता मनमाना स्थिरांक धारण करने के लिए सीमित है। छोटे स्थिरांक अधिकांश CPU निर्देशों द्वारा समर्थित हैं। "बड़े" स्थिरांक आमतौर पर सीधे समर्थित नहीं होते हैं। उस स्थिति में संकलक निरंतर स्मृति में संग्रहीत करेगा और इसके बजाय इसे लोड करेगा। उदाहरण के लिए,
.psect rodata
k1 dd 3141592653
.psect code
mov eax k1
एआरएम परिवार सबसे स्थिरांक सीधे लोड करने के लिए एक शक्तिशाली डिजाइन किया गया है: किसी भी 8 बिट निरंतर मूल्य किसी भी भी समय की संख्या घुमाया जा सकता है। this पृष्ठ 2-25 देखें।
एक नहीं के रूप में स्पष्ट है, लेकिन पूरी तरह से अलग आइटम बयान में है:
printf("%d", b+c);
स्ट्रिंग %d
आधुनिक सी अर्थ विज्ञान, तीन char
की एक निरंतर सरणी से, है। अधिकांश आधुनिक कार्यान्वयन इसे रीड-ओनली मेमोरी में संग्रहीत करेंगे ताकि इसे बदलने का प्रयास एक सेगफाल्ट का कारण बन सके, जो निम्न स्तर की सीपीयू त्रुटि है जो आम तौर पर प्रोग्राम को निरस्त करने का कारण बनता है।
.psect rodata
s1 db '%', 'd', 0
.psect code
mov eax s1
push eax
चूंकि आपके प्रोग्राम में कोई अवलोकन प्रभाव नहीं है, इसलिए संकलक पूरी तरह से कुछ भी स्टोर करने के लिए स्वतंत्र नहीं है। ([उदाहरण] (https://godbolt.org/g/5DAwmj)) –
अपने प्रश्न की विशिष्टताओं को छोड़कर, कॉन्स डेटा सामान्य रूप से अपने स्वयं के खंड में संग्रहीत होता है उदा। ".rodata" (केवल पढ़ने के लिए ro)। 'Int' जैसे पीओडी प्रकारों के लिए, स्मृति मान सीधे निष्पादन योग्य फ़ाइल के उस खंड पर लिखे जाते हैं, जिसे ओएस इसे शुरू करते समय स्मृति में लोड करता है। इस तरह के मामले में स्मृति को शुरू करने के लिए कोई निर्देश आवश्यक नहीं है - यह इस तरह के सही मूल्य से शुरू होता है! ग्लोबल (गैर-कॉन्स) डेटा आमतौर पर अपने स्वयं के खंड में भी दिखाई देता है, उदा। '.डेटा' या '.bss' (.bss को ओएस द्वारा प्रोग्राम स्टार्टअप पर शून्य से प्रारंभ किया गया है)। – Cameron
विवरण आपके प्लेटफ़ॉर्म पर बहुत अधिक निर्भर करते हैं। कुछ आईएसए निर्देशों में तत्काल मूल्यों की अनुमति देते हैं, इसलिए मूल्य कुछ निर्देशों का हिस्सा हो सकते हैं; अन्य मूल्य केवल प्रोग्राम छवि का हिस्सा हो सकते हैं और पते द्वारा संदर्भित किए जाते हैं। अन्य मान अभी तक (शून्य की तरह) को किसी भी स्टोरेज की आवश्यकता नहीं हो सकती है और इसके बजाय विशेष लोडिंग यांत्रिकी के माध्यम से प्रदान की जाती है। –