2010-04-27 13 views
6

मुझे सी ++ के पागल और बोल्ट में दिलचस्पी है और मुझे आश्चर्य हुआ कि किसी ऑब्जेक्ट को तुरंत चालू करने पर वास्तव में क्या बदलता है। यदि विशेष रूप से रनटाइम से हैं या यदि वे स्मृति में कभी भी संग्रहीत नहीं होते हैं तो फ़ंक्शन को स्मृति में जोड़ा जाता है, तो मुझे विशेष रूप से रूचि है।स्मृति में क्या होता है जब एक सी ++ वर्ग तत्काल

यदि कोई मुझे सी और सी ++ के कुछ कोर बोल्ट पर एक अच्छी साइट पर निर्देशित कर सकता है, तो मुझे वह भी पसंद आएगा।

धन्यवाद, जो

उत्तर

1

एक आम मामला है:

  1. मेमोरी operator new फोन करके आवंटित किया जाता है। यह फ़ंक्शन शायद पहले से ही स्मृति में होगा, इसकी बहुत आवश्यकता है।
  2. कक्षा के निर्माता को बुलाया जाता है। यह कोड पहले से ही स्मृति में हो सकता है। यदि नहीं, तो इस फ़ंक्शन पेज-दोषों पर कॉल करें। ओएस नोट करता है, और आपके निष्पादन योग्य से उचित पृष्ठ को रैम में लोड करता है। फिर यह ओएस को पुनः प्रयास करने के लिए कहता है। (2 ए। सीटीआर वर्चुअल फ़ंक्शंस को कॉल करने योग्य होने के लिए व्यवस्थित करता है - अक्सर एक vtable पॉइंटर लिखकर)
  3. संभावना है कि निर्माता के साथ पृष्ठ में आपकी कक्षा के अन्य सदस्य भी शामिल हैं। तब भी उन्हें बुलाया जा सकता है। लेकिन अगर वे किसी अन्य पृष्ठ पर हैं, तो उन्हें कॉल करना एक और पेज गलती और दूसरा भार हो सकता है।यदि आपका कंपाइलर किसी भिन्न पृष्ठ पर एक vtable डालता है, तो उस vtable का उपयोग पृष्ठ की गलती का कारण बन सकता है।

ऐसी लोड-ऑन-डिमांड तंत्र का लाभ यह है कि यदि कोई उपयोगकर्ता अपने दस्तावेज़ को मुद्रित करने का इरादा नहीं रखता है तो एक ओएस कक्षा CPrinter के लिए कोड लोड करने से बच सकता है।

1

कार्यों सभी निष्पादन योग्य अपने आप में जमा हो जाती है, तो वे से प्राप्त-जाना लोड कर रहे हैं।

सदस्य चर के लिए उस ऑब्जेक्ट द्वारा आवश्यक किसी भी स्मृति को आवंटित किया जाता है।

यदि आप सोच रहे हैं कि फ़ंक्शन जानता है कि यह किस वस्तु पर कॉल किया जा रहा है, तो मूल रूप से एक अदृश्य "यह" पॉइंटर है जो फ़ंक्शन के पहले पैरामीटर के रूप में पारित होता है।

+0

भले ही ऑब्जेक्ट में कोई भी सदस्य न हो, फिर भी यह कुछ स्मृति आवंटित किया जाता है ताकि यह सुनिश्चित किया जा सके कि सभी वस्तुओं में अद्वितीय स्मृति पते हों। – Skizz

7

अच्छी वेबसाइट के बारे में सुनिश्चित नहीं है, लेकिन Inside The C++ Object Model एक बहुत अच्छी किताब है।

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

जब एक सदस्य समारोह कहा जाता है, उस वस्तु की पता कार्य करने के लिए एक छिपा पैरामीटर के रूप में पारित हो जाता है और समारोह में यह रूप में इस कहा जाता है (कई compilers बस इसके लिए एक रजिस्टर आरक्षित)।

+0

मैंने इसे पढ़ा नहीं है, लेकिन अकेले टीओसी के लिए +1। –

0

जब कोई ऑब्जेक्ट तत्काल होता है;

  1. मेमोरी आवंटित किया जाता है
  2. निर्माता निष्पादित किया जाता है
  3. vtable "सेट अप" है

संख्या 3 कारण है कि निर्माताओं के व्युत्पन्न वर्ग में आभासी कार्यों कॉल नहीं कर सकते है (जब निर्माता vtable निष्पादित किया गया है अभी तक "स्थापित" नहीं है)।

आप एक पत्र/लिफाफा मुहावरे का उपयोग कर एक ही प्रभाव प्राप्त कर सकते हैं। इस और अधिक के लिए Advanced C++ Programming Styles and Idioms देखें।

+1

vtables, जबकि वास्तव में मानक द्वारा मौजूद होने की गारंटी नहीं है, को कन्स्ट्रक्टर फ्रेमवर्क के हिस्से के रूप में प्रारंभ किया जाना चाहिए। vtables को कम से कम व्युत्पन्न से व्युत्पन्न किया जाता है (उसी क्रम में जिसमें रचनाकार प्रारंभ किए जाते हैं)। –

+0

@ नाथन - धन्यवाद, मैं विंडोज़ पर बहुत लंबे समय से प्रोग्रामिंग कर रहा हूं। क्या आप मुझे एक कंपाइलर/मंच के बारे में बता सकते हैं जो vtables का उपयोग नहीं करता है? –

0

सामान्य रूप से, जब एक कक्षा को तत्काल किया जाता है, तो स्मृति का नया ब्लॉक आवंटित किया जाता है। आवंटित स्मृति में शामिल हैं:

  1. कक्षा के गैर स्थैतिक डेटा सदस्य और बेस क्लास के विरासत रहित गैर-स्थैतिक डेटा सदस्य।
  2. यदि कक्षा में एक या अधिक वर्चुअल फ़ंक्शंस हैं, तो क्लास इंस्टेंस में उस श्रेणी के virtual function table पर पॉइंटर भी शामिल है।

कक्षा के कार्यों की प्रतिलिपि बनाई जाती है जब कोई नया उदाहरण बनाया जाता है। This ऑब्जेक्ट के आकार को समझने में मदद करेगा।

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