मुझे आशा है कि आपको एहसास होगा कि यह सब जावा और सी ++ दोनों के लिए गहराई से कार्यान्वयन-परिभाषित है। कहा जा रहा है कि, जावा के ऑब्जेक्ट मॉडल के लिए काफी कम जगह की आवश्यकता होती है।
C ++ ऑब्जेक्ट्स को सदस्यों की आवश्यकता के अलावा किसी भी भंडारण की आवश्यकता नहीं होती है। ध्यान दें कि (जावा के विपरीत, जहां उपयोगकर्ता द्वारा परिभाषित सब कुछ एक संदर्भ प्रकार है), क्लाइंट कोड किसी ऑब्जेक्ट का उपयोग मान प्रकार या संदर्भ प्रकार दोनों के रूप में कर सकता है, अर्थात कोई ऑब्जेक्ट किसी अन्य ऑब्जेक्ट के लिए पॉइंटर / संदर्भ स्टोर कर सकता है या ऑब्जेक्ट को सीधे स्टोर कर सकता है अप्रत्यक्ष के बिना। यदि कोई virtual
विधियाँ हैं, तो प्रति ऑब्जेक्ट एक अतिरिक्त पॉइंटर आवश्यक है , लेकिन पॉलीमोर्फिज़्म के बिना प्राप्त करने के लिए काफी उपयोगी कक्षाएं डिज़ाइन की गई हैं और इसकी आवश्यकता नहीं है। कोई GC मेटाडेटा और कोई प्रति-ऑब्जेक्ट लॉक नहीं है। इस प्रकार class IntWrapper { int x; public: IntWrapper(int); ... };
वस्तुओं को प्लेन int
एस की तुलना में अधिक जगह की आवश्यकता नहीं होती है , और संग्रह और अन्य वस्तुओं में सीधे (अर्थात अप्रत्यक्ष रूप से बिना) रखा जा सकता है।
Arrays मुश्किल है क्योंकि कोई पूर्व-निर्मित नहीं है, C ++ में जावा ऐरे के बराबर आम है। आप बस के साथ वस्तुओं का एक गुच्छा आवंटित कर सकते हैं new[]
(बिल्कुल नहीं ओवरहेड / मेटाडेटा के साथ) लेकिन कोई लंबाई फ़ील्ड नहीं है - कार्यान्वयन शायद एक को संग्रहीत करता है लेकिन आप इसे एक्सेस नहीं कर सकते। std::vector
एक गतिशील सरणी है और इस प्रकार अतिरिक्त ओवरहेड और बड़ा इंटरफ़ेस है। std::array
और सी-स्टाइल सरणियाँ (int arr[N];
), एक संकलन-समय स्थिर की जरूरत है। सिद्धांत रूप में, यह सिर्फ ऑब्जेक्ट का स्टोरेज और लंबाई के लिए एक ही पूर्णांक होना चाहिए - लेकिन चूंकि आप गतिशील आकार परिवर्तन प्राप्त कर सकते हैं और बहुत कम अतिरिक्त स्थान के साथ पूरी तरह से चित्रित इंटरफ़ेस, आप बस उस अभ्यास के लिए जाते हैं। ध्यान दें कि ये सभी, साथ ही अन्य सभी संग्रह, वस्तुओं को मूल्य द्वारा संग्रहीत करने के लिए डिफ़ॉल्ट हैं, इस प्रकार आपको अप्रत्यक्ष और संदर्भों के लिए जगह की बचत होती है, और कैश व्यवहार में सुधार होता है। अप्रत्यक्ष रूप से प्राप्त करने के लिए आपको स्पष्ट रूप से पॉइंटर्स (स्मार्ट वाले, कृपया) स्टोर करना होगा।
उपरोक्त तुलना पूरी तरह से उचित नहीं है, क्योंकि इनमें से कुछ बचतों को जावा की विशेषताओं को शामिल नहीं करके खर्च किया जाता है, और उनके सी ++ समकक्ष को अक्सर जावा समकक्ष (*) की तुलना में कम अनुकूलित किया जाता है। आम तरीका लागू करने के लिए virtual
वास्तव में आम तरीका लागू करने के लिए के रूप में ज्यादा भूमि के ऊपर के रूप में सी ++ लगाता में virtual
जावा में। लॉक प्राप्त करने के लिए, आपको पूरी तरह से म्यूटेक्स ऑब्जेक्ट की आवश्यकता होती है, जो कि कुछ बिट्स की तुलना में सबसे अधिक संभावना है। संदर्भ गिनती प्राप्त करने के लिए ( नहींजीसी के बराबर, और इस तरह के रूप में इस्तेमाल नहीं किया जाना चाहिए, लेकिन कभी-कभी उपयोगी), आपको एक स्मार्ट पॉइंटर की आवश्यकता होती है जो एक संदर्भ गणना फ़ील्ड जोड़ता है। जब तक कि वस्तु का सावधानीपूर्वक निर्माण नहीं किया जाता है, संदर्भ गणना, स्मार्ट पॉइंटर ऑब्जेक्ट, और संदर्भित ऑब्जेक्ट पूरी तरह से अलग स्थानों पर होते हैं, और जब आप इसे सही तरीके से बनाते हैं, तब भी साझा किए गए पॉइंटर (एक?) के बजाय दो बिंदु हो सकते हैं। फिर, अच्छी सी ++ शैली इन विशेषताओं का उपयोग करने के लिए पर्याप्त नहीं है यह बात करने के लिए - व्यवहार में, एक अच्छी तरह से लिखा सी ++ लाइब्रेरी की वस्तुएं कम उपयोग करती हैं। यह जरूरी नहीं कि समग्र रूप से कम मेमोरी उपयोग का मतलब है, लेकिन इसका मतलब यह है कि इस संबंध में सी ++ की अच्छी शुरुआत है।
(*) उदाहरण के लिए, आप आभासी कॉल, पहचान हैश कोड और कुछ वस्तुओं के लिए केवल एक शब्द के साथ लॉक कर सकते हैं (और कई अन्य वस्तुओं के लिए दो शब्द) विभिन्न झंडे के साथ प्रकार की जानकारी को मर्ज करके, और उन वस्तुओं के लिए लॉक बिट्स को हटा सकते हैं जो हैं ताले की जरूरत नहीं है। देखें अंतरिक्ष और समय कुशल जावा ऑब्जेक्ट मॉडल का कार्यान्वयन इस और अन्य अनुकूलन के एक विस्तृत विवरण के लिए (पीडीएफ) डेविड एफ बेकन, स्टीफन जे फिंक, और डेविड ग्रोव द्वारा।
int
? यदि हां, तो आपको इसकी तुलनाint
जावा में करनी चाहिए , तब तक नहींInteger
- जब तक कि आपका C ++ इन्टर्ब 32बिट्स नहीं हो जाता।