हर गैर सरणी गैर स्ट्रिंग ढेर पर संग्रहीत वस्तु एक 8- या 16-बाइट हैडर (32/64-बिट सिस्टम के लिए आकार), उस वस्तु के सार्वजनिक और की सामग्री के बाद होता है निजी क्षेत्र Arrays और तारों में उपरोक्त शीर्षलेख होता है, साथ ही प्रत्येक तत्व के आकार और आकार (प्रत्येक संभवतः आयामों की संख्या, प्रत्येक अतिरिक्त आयाम की लंबाई इत्यादि) की लंबाई को परिभाषित करने वाले कुछ और बाइट्स, इसके बाद पहले के सभी फ़ील्ड तत्व, फिर दूसरे के सभी क्षेत्रों, आदि। किसी ऑब्जेक्ट के संदर्भ को देखते हुए, सिस्टम आसानी से हेडर की जांच कर सकता है और यह निर्धारित कर सकता है कि यह किस प्रकार का है।
संदर्भ-प्रकार भंडारण स्थानों में चार- या आठ-बाइट मान होता है जो ढेर पर संग्रहीत ऑब्जेक्ट को विशिष्ट रूप से पहचानता है। वर्तमान कार्यान्वयन में, वह मान एक सूचक है, लेकिन इसे "ऑब्जेक्ट आईडी" के रूप में सोचने के लिए यह आसान (और अर्थात् समकक्ष) है।
मूल्य-प्रकार भंडारण स्थान मान प्रकार के फ़ील्ड की सामग्री रखते हैं, लेकिन कोई संबद्ध शीर्षलेख नहीं है। यदि कोड Int32
प्रकार का एक चर घोषित करता है, तो उस Int32
के साथ जानकारी संग्रहीत करने की आवश्यकता नहीं है कि यह क्या है। तथ्य यह है कि उस स्थान पर Int32
प्रभावी रूप से प्रोग्राम के हिस्से के रूप में संग्रहीत है, और इसलिए इसे स्थान में ही संग्रहीत नहीं किया जाना चाहिए। यह एक बड़ी बचत का प्रतिनिधित्व करता है, उदाहरण के लिए, एक में दस लाख वस्तुएं हैं जिनमें से प्रत्येक का प्रकार Int32
है। Int32
वाले प्रत्येक ऑब्जेक्ट में एक शीर्षलेख है जो उस वर्ग को पहचानता है जो इसे संचालित कर सकता है। चूंकि उस वर्ग कोड की एक प्रति लाखों उदाहरणों पर काम कर सकती है, इस तथ्य के साथ कि क्षेत्र Int32
है, कोड का हिस्सा उन क्षेत्रों में से प्रत्येक के लिए भंडारण होने से कहीं अधिक कुशल है, इसमें यह जानकारी शामिल है कि यह क्या है ।
बॉक्सिंग आवश्यक है जब मूल्य-प्रकार भंडारण स्थान की सामग्री को उस कोड पर पास करने के लिए अनुरोध किया जाता है जो उस विशेष मान प्रकार की अपेक्षा नहीं करता है। कोड जो अज्ञात प्रकार की वस्तुओं की अपेक्षा करता है, ढेर पर संग्रहीत किसी ऑब्जेक्ट का संदर्भ स्वीकार कर सकता है। चूंकि ढेर पर संग्रहीत प्रत्येक ऑब्जेक्ट में एक हेडर है जो यह पहचानता है कि यह किस प्रकार की ऑब्जेक्ट है, कोड उस हेडर का उपयोग तब भी कर सकता है जब किसी ऑब्जेक्ट का उपयोग किसी प्रकार से करना आवश्यक हो जिसके लिए इसके प्रकार को जानने की आवश्यकता होगी।
ध्यान दें कि .NET में, सामान्य वर्गों और विधियों के रूप में घोषित करना संभव है। इस तरह की प्रत्येक घोषणा स्वचालित रूप से कक्षाओं या विधियों का एक परिवार उत्पन्न करती है जो कि किले को छोड़कर समान होती हैं, जिस पर वह कार्य करने की अपेक्षा करता है। यदि कोई Int32
को नियमित DoSomething<T>(T param)
पर पास करता है, जो स्वचालित रूप से दिनचर्या का एक संस्करण उत्पन्न करेगा जिसमें T
के प्रत्येक उदाहरण प्रभावी रूप से Int32
के साथ प्रतिस्थापित किया गया है। दिनचर्या के उस संस्करण को पता चलेगा कि टाइप T
के रूप में घोषित प्रत्येक स्टोरेज स्थान Int32
रखता है, जैसे कि Int32
स्टोरेज स्थान का उपयोग करने के लिए नियमित रूप से हार्ड-कोड किया गया था, तो उन लोगों के साथ प्रकार की जानकारी स्टोर करना आवश्यक नहीं होगा खुद को स्थान।
सी ++ से जावा तक आ रहा है, जब मैं इस तथ्य की खोज करता हूं तो मैं पूरी तरह से बेहद चौंक गया था ... – GuLearn