2010-04-02 8 views
16

मैंने कल एक प्रश्न देखा जो मेरे लिए एक और सवाल उठाया। कृपया निम्नलिखित कोड को देखो:कक्षा के क्षेत्र, क्या वे ढेर या ढेर में संग्रहित हैं?

public class Class1 
{ 
    int A; //as I uderstand, int is value type and therefore lives in the stack 
} 

class Class2 
{ 
    Run() 
    { 
     Class1 instance1 = new Class1(); 
     instance1.A = 10; //it points to value type, but isnt this reference (on heap)? 
    } 
} 

या जबकि Class1 का उदाहरण बनाकर, अपने क्षेत्र प्रकार के रूप में अच्छी तरह ढेर पर बनाई गई हैं? लेकिन तब मुझे समझ में नहीं आता कि यह वास्तव में ढेर पर कब होगा क्योंकि लगभग हमेशा आपको इसे फ़ील्ड का उपयोग करने के लिए ऑब्जेक्ट का उदाहरण बनाना होगा।

+0

क्लास के नाम एक नंबर – cpalmer

+0

साथ शुरू करने के लिए विषय से हटकर अनुमति नहीं है: आप वहाँ पर – thelost

+0

धन्यवाद अमान्य वर्ग नाम है, निश्चित :) – Mirek

उत्तर

3

स्टैक पर स्थानीय संरचना (मान प्रकार) चर संग्रहित होते हैं, कक्षा के मूल्य प्रकार फ़ील्ड ढेर पर संग्रहीत होते हैं।

+7

जब तक (1) स्थानीय व्यवहार्य एक अज्ञात विधि या लैम्ब्डा अभिव्यक्ति का बंद-बाहरी बाहरी स्थानीय है, या (2) स्थानीय एक इटरेटर ब्लॉक में है, या (3) जिटर स्टैक के बजाय रजिस्टरों का उपयोग करने का निर्णय लेता है। –

+0

उदाहरण 1 वैरिएबल के साथ क्या होता है जहां तक ​​इसका भंडारण संबंधित है। यह एक संदर्भ प्रकार है लेकिन साथ ही यह फ़ंक्शन रन() के लिए स्थानीय है। उदाहरण 1 स्टैक या ढेर पर सहेजा जाएगा? – RBT

+0

मुझे खेद है @EricLippert एक और टिप्पणी के लिए लेकिन मैं अपने पिछले एक को संपादित करने की कोशिश कर रहा था लेकिन समय पर ऐसा नहीं कर सका। बस ऊपर दिए गए मेरे प्रश्न में स्पष्टता जोड़ने के लिए मैं दो चीजें पूछना चाहता हूं 1. जहां संदर्भ उदाहरण 1 सहेजा जाएगा। example1 केवल एक संदर्भ है जिसमें वास्तविक ऑब्जेक्ट उदाहरण रहता है जहां 2. ऑब्जेक्ट, उदाहरण 1 द्वारा संदर्भित कक्षा 1 का उदाहरण निवास करेगा। यहां ऑब्जेक्ट कक्षा 1 का एक उदाहरण है लेकिन रन() विधि में स्थानीय दायरा है। – RBT

2

ठीक int एक मान प्रकार है लेकिन '1' (कक्षा के लिए एक भयानक नाम) एक संदर्भ प्रकार है। इसका मतलब है कि '1' का कोई भी उदाहरण ढेर पर है।

36

के रूप में मैं समझता हूँ, पूर्णांक मान प्रकार है और इसलिए ढेर

आपकी समझ सही नहीं है में रहती है। मान प्रकारों को "मान प्रकार" कहा जाता है क्योंकि उन्हें मूल्य द्वारा प्रतिलिपि बनाई जाती है। संदर्भ प्रकार को "संदर्भ प्रकार" कहा जाता है क्योंकि उन्हें संदर्भ द्वारा प्रतिलिपि बनाई जाती है। यह बिल्कुल सही नहीं है कि "मूल्य प्रकार हमेशा ढेर पर रहते हैं"। यदि यह सच था, तो उन्हें "ढेर प्रकार" और "ढेर प्रकार" कहा जाएगा।

सच यह है कि यह एक कार्यान्वयन विस्तार है। विभिन्न रूपरेखा कार्यान्वयन स्टैक और ढेर का उपयोग करने के लिए चुन सकते हैं। यहां बताया गया है कि माइक्रोसॉफ्ट कार्यान्वयन कैसे करता है:

  • संदर्भ प्रकार के चर के मान को ढेर स्मृति का संदर्भ है। एक संदर्भ मूल रूप से 32 बिट या 64 बिट पूर्णांक है।
  • मूल्य प्रकार के चर के मान का मूल्य है।
  • स्थानीय चर के मान स्टैक पर संग्रहीत किए जाते हैं जब तक कि स्थानीय चर एक इटरेटर ब्लॉक में न हों या अज्ञात विधि या लैम्ब्डा अभिव्यक्ति के बाहरी चर के बंद हो जाएं। उन मामलों में स्थानीय चर के मान ढेर पर संग्रहीत किए जाते हैं। बेशक स्थानीय चर को अनुकूलित किया जा सकता है, इस मामले में कोई भंडारण नहीं है। या शायद उन्हें अपंजीकृत किया जा सकता है, इस मामले में वे न तो ढेर और ढेर पर हैं, वे प्रोसेसर रजिस्टरों में हैं।
  • संदर्भ प्रकारों और स्थिर चर के आवृत्ति चर के मान ढेर पर संग्रहीत किए जाते हैं।

क्या यह स्पष्ट है?

यह मूल्य प्रकार के लिए इंगित करता है, लेकिन यह संदर्भ (ढेर पर) नहीं है?

फ़ील्ड "ए" मूल्य प्रकार का है। यह एक क्षेत्र है, और इसलिए उस चर को ढेर पर संग्रहीत किया जाता है।

कक्षा 1 का उदाहरण बनाते समय, इसके क्षेत्र के प्रकार ढेर पर भी बनाए जाते हैं?

इंस्टेंस चर के लिए भंडारण ढेर पर है, हां।

लेकिन तब मुझे समझ में नहीं आता कि यह वास्तव में ढेर पर कब होगा क्योंकि लगभग हमेशा आपको इसे फ़ील्ड का उपयोग करने के लिए ऑब्जेक्ट का उदाहरण बनाना होगा।

यह कभी भी ढेर पर नहीं होगा। जैसा कि मैंने उपर्युक्त कहा है, स्टैक पर जाने वाली एकमात्र चीजें स्थानीय चर (और कंपाइलर-जेनरेटेड अस्थायी) हैं जो लैम्ब्डा या अज्ञात विधि के बंद-स्थानीय इलाकों में नहीं हैं और एक पुनरावर्तक ब्लॉक में नहीं हैं। और निश्चित रूप से, जिटर उन्हें पूरी तरह से ढेर से दूर रखने के लिए स्वतंत्र है और यदि नि: शुल्क रजिस्ट्रार हैं तो उन्हें रजिस्टरों में डाल दें।

लेकिन वास्तव में, मुझे पूछना है, आपको क्यों ख्याल है कि ढेर पर क्या चल रहा है और ढेर पर क्या चल रहा है? ढेर पर क्या चल रहा है वह सामान है जिसे हम सस्ते रूप से ढेर पर रख सकते हैं; बाकी सब कुछ ढेर पर चला जाता है।

+0

मुझे जॉन शार्प की पुस्तक मिली है जिसमें कहा गया है कि "मूल्य प्रकार ढेर पर बनाए जाते हैं जबकि ढेर पर संदर्भ प्रकार"। इसे भी समझ में नहीं आता है। – Thomas

+0

"उदाहरण के मान और स्थैतिक चर ढेर पर संग्रहीत हैं।" एक उदाहरण के स्ट्रक्चर-टाइप किए गए इंस्टेंस वेरिएबल्स को छोड़कर जो स्टैक पर संग्रहीत किया गया है, है ना? – Joren

+2

"आपको ख्याल पर क्या चल रहा है और ढेर पर क्या चल रहा है" - क्योंकि कुछ साक्षात्कारकर्ता इस तरह के प्रश्नों को बहुत पसंद करते हैं और बहुत से लोग इस तरह के साक्षात्कार में विफल रहे हैं क्योंकि यह हर जगह लिखा जाता है कि int चर हमेशा ढेर पर संग्रहीत होते हैं, न कि "स्टैक पर जाने वाली एकमात्र चीजें स्थानीय चर हैं" – Laserson

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