संकलन-समय पर आबंटित मेमोरी का अर्थ है कि संकलक संकलन-समय पर हल होता है जहां कुछ चीजें प्रक्रिया मेमोरी मैप के अंदर आवंटित की जाएंगी।
उदाहरण के लिए, एक वैश्विक सरणी पर विचार करें:
int array[100];
कंपाइलर समय-समय पर सरणी के आकार और आकार के आकार को int
जानता है, इसलिए यह संकलन-समय पर सरणी के पूरे आकार को जानता है। वैश्विक चर में डिफ़ॉल्ट रूप से स्थिर भंडारण अवधि होती है: यह प्रक्रिया मेमोरी स्पेस (.data / .bss अनुभाग) के स्थिर मेमोरी क्षेत्र में आवंटित की जाती है। उस जानकारी को देखते हुए, संकलक संकलन के दौरान यह तय करता है कि उस स्थैतिक मेमोरी क्षेत्र के किस पते पर सरणी होगी ।
बेशक कि मेमोरी एड्रेस वर्चुअल एड्रेस हैं। कार्यक्रम मानता है कि इसकी अपनी पूरी मेमोरी स्पेस है (उदाहरण के लिए 0x00000000 से 0xFFFFFFFF तक)। इसीलिए कंपाइलर "ओके, सरणी 0x00A33211" पते पर होगा। रनटाइम के दौरान जो पते MMU और OS द्वारा वास्तविक / हार्डवेयर पते पर अनुवादित किए जाते हैं।
मूल्य इनिशियलाइज़ स्टैटिक स्टोरेज चीजें थोड़ी अलग होती हैं। उदाहरण के लिए:
int array[] = { 1 , 2 , 3 , 4 };
हमारे पहले उदाहरण में, संकलक ने केवल यह तय किया कि निष्पादन योग्य में उस जानकारी को संग्रहीत करते हुए, सरणी को कहाँ आवंटित किया जाएगा।
मूल्य-प्रारंभिक चीजों के मामले में, कंपाइलर सरणी के प्रारंभिक मूल्य को निष्पादन योग्य में भी इंजेक्ट करता है, और कोड जोड़ता है जो प्रोग्राम लोडर को बताता है कि प्रोग्राम प्रारंभ में सरणी आवंटन के बाद, सरणी को इन मानों से भरना चाहिए।
यहाँ संकलक द्वारा निर्मित असेंबली के दो उदाहरण दिए गए हैं (x86 लक्ष्य के साथ GCC4.8.1):
C ++ कोड:
int a[4];
int b[] = { 1 , 2 , 3 , 4 };
int main()
{}
आउटपुट असेंबली:
a:
.zero 16
b:
.long 1
.long 2
.long 3
.long 4
main:
pushq %rbp
movq %rsp, %rbp
movl $0, %eax
popq %rbp
ret
जैसा कि आप देख सकते हैं, मानों को सीधे विधानसभा में इंजेक्ट किया जाता है। सरणी में a
, संकलक 16 बाइट्स का एक शून्य आरंभीकरण उत्पन्न करता है, क्योंकि मानक कहता है कि स्थिर संग्रहीत चीजों को डिफ़ॉल्ट रूप से शून्य पर आरंभीकृत किया जाना चाहिए:
8.5.9 (प्रारंभिक) [नोट]:
स्थिर भंडारण अवधि की प्रत्येक वस्तु किसी अन्य प्रारंभिक-प्रारंभिक स्थान से पहले प्रोग्राम स्टार्टअप पर शून्य-आरंभीकृत होती है। कुछ मामलों में, बाद में अतिरिक्त इनिशियलाइज़ेशन किया जाता है।
मैं हमेशा लोगों को अपने कोड को डिसाइड करने के लिए सुझाव देता हूं कि कंपाइलर वास्तव में C ++ कोड के साथ क्या करता है। यह उन्नत संकलक अनुकूलन के लिए भंडारण वर्गों / अवधि (इस प्रश्न की तरह) से लागू होता है। आप अपने कंपाइलर को असेंबली जेनरेट करने के लिए निर्देश दे सकते हैं, लेकिन इंटरनेट पर एक दोस्ताना तरीके से ऐसा करने के लिए अद्भुत उपकरण हैं। मेरा पसंदीदा जीसीसी एक्सप्लोरर है ।