मैं एक जंगली अनुमान लगाऊंगा:
सी ++ कंस्ट्रक्टर और डिस्ट्रॉक्टर बिल्कुल भी कार्य नहीं करते हैं: वे मैक्रोज़ हैं। वे उस दायरे में अन्तर्निहित हो जाते हैं जहाँ वस्तु का निर्माण होता है, और वह क्षेत्र जहाँ वस्तु नष्ट होती है। बदले में, कोई भी निर्माता या विध्वंसक नहीं है, वस्तु सिर्फ आईएस है।
वास्तव में, मुझे लगता है कि कक्षा में अन्य फ़ंक्शन न तो फ़ंक्शंस हैं, बल्कि इनलाइन फ़ंक्शंस जो न इनलेट होते हैं क्योंकि आप उनका पता लेते हैं (कंपाइलर को पता चलता है कि आप इस पर हैं और इनलाइन नहीं है या फ़ंक्शन में कोड को इनलाइन करता है और उस फ़ंक्शन का अनुकूलन करता है) और बदले में फ़ंक्शन "अभी भी वहां है" लगता है, भले ही आपने इसका पता नहीं लगाया हो।
C ++ "ऑब्जेक्ट" की वर्चुअल टेबल एक जावास्क्रिप्ट ऑब्जेक्ट की तरह नहीं है, जहां आप इसके 'कंस्ट्रक्टर को प्राप्त कर सकते हैं और रनटाइम के दौरान इसमें से ऑब्जेक्ट्स बना सकते हैं new XMLHttpRequest.constructor
, बल्कि पॉइंटर्स का एक संग्रह जो गुमनाम फ़ंक्शंस में काम करता है, जो इस ऑब्जेक्ट के साथ इंटरफेस के रूप में कार्य करता है। , वस्तु बनाने की क्षमता को छोड़कर। और इससे ऑब्जेक्ट को "हटाने" का भी कोई मतलब नहीं है, क्योंकि यह एक संरचना को हटाने की कोशिश कर रहा है, आप नहीं कर सकते: यह सिर्फ एक स्टैक लेबल है, बस इसे किसी अन्य लेबल के तहत कृपया लिखें: आप इसके लिए स्वतंत्र हैं 4 पूर्णांक के रूप में एक वर्ग का उपयोग करें:
/* i imagine this string gets compiled into a struct, one of which's members happens to be a const char * which is initialized to exactly your string: no function calls are made during construction. */
std::string a = "hello, world";
int *myInt = (int *)(*((void **)&a));
myInt[0] = 3;
myInt[1] = 9;
myInt[2] = 20;
myInt[3] = 300;
कोई स्मृति रिसाव नहीं है, कोई समस्या नहीं है, सिवाय इसके कि आप प्रभावी रूप से स्टैक स्पेस का एक गुच्छा बर्बाद करते हैं जो ऑब्जेक्ट इंटरफेसिंग और स्ट्रिंग के लिए आरक्षित है, लेकिन यह आपके प्रोग्राम को नष्ट करने वाला नहीं है (जब तक आप इसका उपयोग करने की कोशिश नहीं करते हैं। एक तार के रूप में फिर से)।
वास्तव में, अगर मेरी पहले की धारणा सही है: स्ट्रिंग की पूरी लागत सिर्फ इन 32 बाइट्स और स्थिर स्ट्रिंग स्थान को संग्रहीत करने की लागत है: फ़ंक्शन केवल संकलन समय पर उपयोग किए जाते हैं, और इनबिल्ट हो सकते हैं और बाद में फेंक दिया जाता है ऑब्जेक्ट बनाया और उपयोग किया जाता है (जैसे कि आप एक संरचना के साथ काम कर रहे थे और केवल इसे बिना किसी फ़ंक्शन कॉल के सीधे संदर्भित किया गया था, सुनिश्चित करें कि फ़ंक्शन जंप के बजाय डुप्लिकेट कॉल हैं, लेकिन यह आमतौर पर तेज़ है और कम स्थान का उपयोग करता है)। संक्षेप में, जब भी आप किसी फ़ंक्शन को कॉल करते हैं, तो कंपाइलर केवल उस जगह को बदल देता है, जो निर्देशों के साथ कॉल करने के लिए वस्तुतः करते हैं, अपवादों के साथ जो भाषा डिजाइनर सेट करते हैं।
सारांश: सी ++ वस्तुओं का कोई पता नहीं है कि वे क्या हैं; उनके साथ हस्तक्षेप करने के लिए सभी उपकरण सांख्यिकीय रूप से झुके हुए हैं, और रनटाइम में खो गए हैं। यह कक्षाओं को डेटा के साथ भरने के रूप में कुशल बनाता है, और किसी भी फ़ंक्शन को कॉल किए बिना सीधे उस डेटा के साथ काम करना (ये फ़ंक्शन इनबिल्ड हैं)।
यह COM / ObjectiveC के दृष्टिकोणों के साथ-साथ जावास्क्रिप्ट से पूरी तरह से अलग है, जो रनटाइम ओवरहेड, मेमोरी मैनेजमेंट, कंस्ट्रक्शन के कॉल की कीमत पर टाइप जानकारी को गतिशील रूप से बनाए रखता है, क्योंकि कंपाइलर इस जानकारी को फेंक नहीं सकते: गतिशील प्रेषण के लिए। यह बदले में हमें रनटाइम में हमारे प्रोग्राम के लिए "टॉक" करने की क्षमता देता है, और इसे प्रतिबिंबित करने योग्य घटकों के होने के दौरान इसे विकसित करता है।