2012-03-24 8 views
10

किसी सामान्य रूप में बता सकते हैं क्या क्या (हार्डड्राइव, रैम, ढेर या ढेर) को इन उदाहरणों के लिए C++ में कार्यावधि में चला जाता है:सी ++ में रैम, हार्डड्राइव, स्टैक और हीप में क्या जाता है?

  • स्थानीय/वैश्विक चर

  • वर्ग, तरीके और कार्यों

  • प्वाइंटर

  • ऑब्जेक्ट्स

और भौतिक RAM में स्थित स्टैक/हीप दोनों है?

अगर कोई जवाब में हार्डवेयर अनुरूपता शामिल कर सकता है तो मैं सराहना करता हूं। धन्यवाद।

+0

मैं होमवर्क या परीक्षा की तैयारी गंध के माध्यम से मतलब है :) कि सब के सब जब तक प्रश्न उचित रूप से टैग किया जाता है ठीक है,। – dasblinkenlight

+4

* प्रोग्रामिंग भाषाओं * और * कंप्यूटिंग हार्डवेयर * मिश्रण न करें। पूर्व एक भाषा है, बाद में जब आप इसे मंजिल पर छोड़ देते हैं तो टूट जाता है। प्रोग्रामिंग भाषाओं का उपयोग * कंप्यूटर * को * निर्देशित करने के लिए किया जा सकता है, लेकिन वे पहले और सबसे महत्वपूर्ण एक अमूर्त निर्माण हैं। –

+0

@ केरेक एसबी: अगर मैं कह सकता हूं तो सी ++ कंप्यूटर को अंत में कहने के लिए कहां कहता है? – Maiss

उत्तर

13

यह आम तौर पर ओएस पर निर्भर है, लेकिन यह इतना की तरह आम तौर पर बताया गया है:

सब कुछ राम को चला जाता है। द्विआधारी हार्ड ड्राइव में रहता है, लेकिन, जब दौड़ता है, निर्भर पुस्तकालयों के साथ, रैम में पूरी तरह से लोड किया जाता है।

ढेर और ढेर कार्यान्वयन विवरण हैं, लेकिन वे रैम में भी रहते हैं।

हालांकि रैम में लोड किया गया, स्मृति सीधे पता योग्य नहीं है। ऑपरेटिंग सिस्टम प्रत्येक प्रक्रिया के लिए वर्चुअल मेमोरी आवंटित करता है। इसका मतलब है कि पता 0x001 वास्तव में रैम में 0x001 पर स्थित नहीं है, लेकिन वर्चुअल एड्रेस स्पेस में एक पता का प्रतिनिधित्व करता है।

संपादित करें:

बाइनरी पूरी तरह या आंशिक क्रम में लोड कर रहे हैं: सेशन की टिप्पणी से एक के लिए स्पष्टीकरण? और, क्या वे बाइनरी केवल एक बार रनटाइम पर पहुंचे हैं या लगातार हार्डड्राइव से पढ़ रहे हैं?

उदाहरण के लिए, एमएस में, यदि आप लाइब्रेरी के खिलाफ लिंक करते हैं, तो यह प्रोग्राम की शुरुआत में रनटाइम पर पूरी तरह से लोड हो जाएगा। यदि आप प्रोग्राम को LoadLibrary() के माध्यम से प्रोग्रामेटिक रूप से लोड करते हैं, तो इसे फ़ंक्शन कॉल पर मेमोरी में लोड किया जाता है, और इसे स्मृति से अनलोड किया जा सकता है।

+4

सब कुछ वर्चुअल मेमोरी पर जाता है, जो हमेशा रैम में नहीं होता है ... –

+0

@GuySirton मैंने निर्दिष्ट किया है, लेकिन आमतौर पर यह रैम है। –

+0

मेरा मानना ​​है कि उनका मुद्दा यह है कि वर्चुअल मेमोरी के कुछ हिस्सों - अर्थात् पेज - डिस्क पर जा सकते हैं और उन्हें बदल दिया जाएगा। – delnan

7

उनमें से सभी स्मृति में जाते हैं। अब, "स्मृति में" की परिभाषा ऑपरेटिंग सिस्टम, कंपाइलर और लिंकर विकल्प, निष्पादन योग्य प्रारूप और दस लाख अन्य कारकों पर निर्भर करती है।

कई आधुनिक ऑपरेटिंग सिस्टम पर, जब कोई प्रक्रिया बनाई जाती है, निष्पादन योग्य फ़ाइल को स्मृति में मैप किया जाता है (इसका मतलब है कि एक मेमोरी क्षेत्र निष्पादन योग्य के लिए आरक्षित था लेकिन इसका मतलब यह नहीं है कि निष्पादन योग्य अभी तक उस स्थान पर लोड किया गया है)।

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

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

निष्कर्ष में, आपकी सूची (चर, फ़ंक्शन इत्यादि) पर सभी आइटम स्मृति में हैं, हालांकि तब भी "भौतिक RAM" में संग्रहीत नहीं किया जा सकता है।

0

सी ++ में, जब आप कोई प्रोग्राम सहेजते हैं, तो यह हार्ड ड्राइव पर जाता है, जब आप प्रोग्राम को संकलित और निष्पादित करना शुरू करते हैं तो यह मुख्य मेमोरी (रैम) पर जाता है। सभी ढेर और ढेर स्मृति राम स्मृति का हिस्सा हैं।

प्रोग्राम और फ़ंक्शन कॉल में परिवर्तनीय घोषणा के अनुसार स्मृति आवंटित की जाती है। डिफ़ॉल्ट स्टैक आकार 2 एमबी (गोगलिंग से) है और इसकी दुकान आपके प्रोग्राम के सभी स्थानीय चर है।

ढेर, सभी डेटा है, जो रन टाइम के दौरान बनाई गई हैं शामिल हैं या तो malloc या new

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