2010-06-20 18 views
10

मुझे पता है कि स्टैक, हीप, कोड और डेटा जैसे अनुभाग हैं। ढेर/ढेर क्या वे स्मृति के उसी खंड का उपयोग करते हैं क्योंकि वे स्वतंत्र रूप से बढ़ सकते हैं? यह कोड अनुभाग क्या है? जब मेरे पास कोई फ़ंक्शन है तो यह स्टैक या कोड सेक्शन का हिस्सा है? यह प्रारंभिक/प्रारंभिक डेटा सेगमेंट क्या है?सी/सी ++ प्रोग्राम का मेमोरी लेआउट कैसा है?

क्या केवल स्मृति अनुभाग उपलब्ध है? जब मेरे पास एक कॉन्स वैरिएबल होता है, तो वास्तव में क्या हो रहा है यह है कि संकलक केवल स्मृति के रूप में स्मृति खंड को चिह्नित करता है या इसे केवल पढ़ने के लिए स्मृति खंड में डालता है।

स्थिर डेटा कहां रखा जाता है? वैश्विक डेटा कहां रखा जाता है?

इसके लिए कोई अच्छा संदर्भ/लेख?

मैंने सोचा कि मेमोरी अनुभाग और लेआउट ओएस स्वतंत्र हैं और इसे कंपाइलर के साथ और अधिक करना है। ढेर, ढेर, कोड, डेटा [प्रारंभ, अनियमित] खंड सभी ओएस में नहीं होता है? जब एक स्थिर डेटा होता है, तो क्या हो रहा है संकलक ने समझा है कि यह स्थिर है, अगला क्या है, यह क्या करेगा? यह संकलक है जो प्रोग्राम का प्रबंधन कर रहा है और यह जानना चाहिए कि सही क्या करना है? सभी कंपाइलर्स को आम मानकों का पालन नहीं करना चाहिए?

+1

+1 - लेकिन यदि आप अलग-अलग प्रश्नों में इसे तोड़ देंगे तो आप कंक्रीट उत्तरों प्राप्त करने की संभावनाओं में काफी सुधार करेंगे। –

+1

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

उत्तर

3

यह ज्यादातर ओएस निर्भर है।

विंडोज़ के लिए पेटज़ोल्ड या रिचटर की किताबें देखें। लिनक्स के लिए आप स्रोत पढ़ सकते हैं!

+0

स्रोत पढ़ें? यह आरटीएफएम की तरह एक बहुत भयानक लगता है: पी –

+0

मुझे लगता है कि उसे रीडिंग द फ़िंग मेमोरी के साथ मदद की ज़रूरत है;) – MSalters

+0

@ मैथ्यूयू एम मैंने एक "!" ;-) –

3

AFAIK:

ढेर/ढेर वे स्मृति के एक ही अनुभाग के रूप में वे स्वतंत्र रूप से बढ़ सकता है उपयोग करते हैं?

वे इंडिपेंडेंट बढ़ सकते हैं।

यह कोड अनुभाग क्या है?

एक केवल-पढ़ने वाला खंड जहां कोड और कॉन्स्ट डेटा संग्रहीत किया जाता है।

जब मेरे पास कोई फ़ंक्शन है तो यह स्टैक या कोड अनुभाग का हिस्सा है?

फ़ंक्शन की परिभाषा (कोड) सीएस में होगी। प्रत्येक कॉल के तर्क स्टैक पर पास किए जाते हैं।

इसके अलावा इस प्रारंभ/अप्रारंभीकृत डेटा खंड क्या है?

डेटा सेगमेंट है जहां ग्लोबल्स/स्थिर चर संग्रहीत किए जाते हैं।

क्या केवल स्मृति अनुभाग उपलब्ध है?

कोड सेगमेंट। मुझे लगता है कि कुछ ओएस के कस्टम रीड-ओनली सेगमेंट बनाने के लिए प्राइमेटिव ऑफर कर सकते हैं।

जब मैं एक स्थिरांक चर है, क्या वास्तव में हो रहा है कि संकलक एक स्मृति खंड के रूप में केवल पढ़ने के लिए या यह एक रीड ओनली मेमोरी अनुभाग में डाल करता है के निशान यह है।

यह सीएस में जाता है।

स्थिर डेटा कहां रखा जाता है? वैश्विक डेटा कहां रखा गया है?

डेटा सेगमेंट।

+0

रीडोनली सेगमेंट शुरुआती विंडोज संस्करणों के साथ बहुत लोकप्रिय थे, यह आपको बहुत कम स्मृति का उपयोग किये बिना ऐप की कई प्रतियां चलाने देता है। यहां तक ​​कि स्ट्रिंग संसाधन साझा रीडोनली सेगमेंट में समाप्त हो गए। –

6

बहुत कम है जो वास्तव में सी ++ मेमोरी लेआउट के बारे में निश्चित है। हालांकि, अधिकांश आधुनिक ओएस कुछ हद तक समान प्रणाली का उपयोग करते हैं, और खंडों को अनुमतियों के आधार पर अलग किया जाता है।

कोड निष्पादन अनुमति है। अन्य खंड नहीं हैं। विंडोज़ एप्लिकेशन में, आप स्टैक पर कुछ मूल कोड नहीं डाल सकते हैं और निष्पादित कर सकते हैं। लिनक्स एक ही कार्यक्षमता प्रदान करता है- यह x86 आर्किटेक्चर में है।

डेटा वह डेटा है जो परिणाम (.exe, आदि) का हिस्सा है लेकिन इसे लिखा नहीं जा सकता है। यह खंड मूल रूप से कहां जाता है। केवल इस खंड में अनुमति पढ़ें।

वे दो खंड परिणामस्वरूप फ़ाइल का हिस्सा हैं। हार्ड ड्राइव से मैप किए जाने के बजाय स्टैक और हीप आवंटित रनटाइम होते हैं।

ढेर अनिवार्य रूप से एक, बड़ा (1 एमबी या तो, कई कंपाइलर इसके लिए एक सेटिंग प्रदान करते हैं) ढेर आवंटन। संकलक इसे आपके लिए प्रबंधित करता है।

हीप मेमोरी स्मृति है कि कुछ प्रक्रिया के माध्यम से ओएस आपको वापस लौटाता है। आम तौर पर, ढेर पॉइंटर्स के एक ढेर (डेटा संरचना) मुक्त मेमोरी ब्लॉक और उनके आकार के लिए है। जब आप एक का अनुरोध करते हैं, तो यह आपको दिया जाता है। दोनों यहां पढ़ने और लिखने की अनुमतियां हैं, लेकिन निष्पादित नहीं हैं।

केवल पढ़ने योग्य स्मृति (रोम) है। हालांकि, यह सिर्फ डेटा खंड है। आप रनटाइम पर इसे बदल नहीं सकते हैं। जब आप एक कॉन्स वैरिएबल बनाते हैं, तो स्मृति में कुछ भी विशेष नहीं होता है। ऐसा ही होता है कि संकलक केवल उस पर कुछ निर्देश बनाएगा। बस। x86 का कोई ज्ञान या धारणा नहीं है- यह सब कंपाइलर में है।

+4

आपने जो कुछ लिखा है, उदा। "ढेर अनिवार्य रूप से एक बड़ा ढेर आवंटन है" या "x86 में 'const'' की कोई धारणा नहीं है, यह बुरी तरह गलत है। मैं सराहना करता हूं कि आप वर्चुअल एड्रेसिंग के बारे में बात किए बिना इसे समझाने की कोशिश कर रहे हैं, लेकिन वर्चुअल मेमोरी वास्तव में महत्वपूर्ण है कि यह सब कैसे काम करता है। विशेष रूप से पृष्ठ सारणी, जहां वे प्रत्येक खंड की अनुमतियां परिभाषित की जाती हैं। और निश्चित रूप से यह सब गैर-x86 प्रोसेसर पर * महत्वपूर्ण * भिन्न होता है। –

+1

मैं वर्चुअल एड्रेसिंग के बारे में पूरी तरह से अवगत हूं। जैसा कि आपने कहा था, मैं इसे सरल रखने की कोशिश कर रहा हूं। – Puppy

0

(नोट: निम्नलिखित लिनक्स पर लागू होता है)

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

char tmpStr[] = "hello"; 

फिर, युक्त स्रोत कोड के भाग "हैलो" rodata खंड में निवास करेंगे।

इस पर एक अच्छी, पूरी किताब रैंडल ई। ब्रायंट के कंप्यूटर सिस्टम है।

+1

ढेर पूरे पता स्थान पर कब्जा नहीं करता है। वास्तव में, यह "स्टैक" के बारे में बात करने में एक त्रुटि है, क्योंकि प्रत्येक धागे का अपना ढेर होता है, और सिग्नल हैंडलिंग, त्रुटि वसूली इत्यादि के लिए अतिरिक्त वैकल्पिक ढेर हो सकते हैं –

+0

जो मैंने यह कहने के लिए समाप्त किया था कि स्टैक पर कब्जा है संपूर्ण पता स्थान जिसे ढेर और ढेर के संयोजन से कब्जा कर लिया जा सकता है। – jrupac

0

मैं उसी दुविधा में था जब मैं सी/सी ++ के मेमोरी लेआउट के बारे में पढ़ रहा था।यहां प्रश्न है जिसे मैंने प्रश्नों को मंजूरी मिलने के लिए किया था।

http://www.geeksforgeeks.org/memory-layout-of-c-program/

लिंक के मुख्य उदाहरण यहाँ जोड़ा जाता है:

enter image description here

मुझे आशा है कि इस मदद करता है 'एक' समान प्रश्न के उत्तर खोजने। जिज्ञासा और उत्साह के लिए

+1

यदि लिंक मर जाता है तो लिंक-केवल उत्तर पोस्ट करना स्टैक ओवरव्लो के भविष्य के उपयोगकर्ताओं के लिए बेकार हो सकता है। उत्तर में लिंक के महत्वपूर्ण बिंदुओं को आजमाएं और शामिल करें –

+0

सलाह के लिए धन्यवाद। पालन ​​करने के लिए निश्चित है। यह मेरा पहला जवाब था :-) –

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