2012-07-25 15 views
5

मैं सोच रहा था,संदर्भ प्रकार और जीसी के साथ संरचना?

कक्षा का एक उदाहरण ढेर पर है। (इसके अंदर मूल्य प्रकार ढेर में भी हैं)।

लेकिन के विपरीत केस के बारे में क्या?

एक सवाल है here लेकिन इसने GC संबंधित जानकारी का उल्लेख नहीं किया।

तो - जीसी इस स्थिति को कैसे संभालता है?

public struct Point 
{ 
object o ; 

    public int x, y; 

    public Point(int p1, int p2) 
    { 
    o = new Object(); 
     x = p1; 
     y = p2;  
    } 
} 

उत्तर

7

Point ढेर पर किसी ऑब्जेक्ट का संदर्भ शामिल है। जैसे ही उस संदर्भ के साथ Point की कोई प्रतियां मौजूद नहीं हैं, यह संग्रह के लिए योग्य हो जाएगी। यह देखते हुए कि:

Point p1 = new Point(1,2); 
Point p2 = p1; 

2 प्रतियां, ढेर पर ही वस्तु के लिए एक संदर्भ के साथ एक है। यदि उन बिंदुओं को किसी ऑब्जेक्ट पर फ़ील्ड के रूप में संग्रहीत किया जाता है, तो स्पष्ट रूप से ऑब्जेक्ट का जीवनकाल कम से कम उन क्षेत्रों के साथ ऑब्जेक्ट होगा। यदि वे बिंदु स्टैक पर केवल चर हैं, तो यह अधिक जटिल हो जाता है, क्योंकि जीसी इस बात को ध्यान में रख सकता है कि कोई चर कभी पढ़ता है। यदि ऐसा नहीं है, तो चर प्रभावी ढंग से मौजूद नहीं हो सकता है (या: यह हो सकता है)।

पथ बहुत अप्रत्यक्ष हो सकता है, लेकिन यह अनिवार्य रूप से नीचे आता है: जीसी जड़ों से शुरू होने पर जीसी वस्तु को प्राप्त कर सकता है।

+0

मार्क I ** ** यह नहीं पूछना चाहता कि क्या यह संरचना स्वयं एक आवृत्ति वर्ग का क्षेत्र सदस्य है .... :) :) –

+0

@ रॉयनामिर बस, वे सब ढेर पर रहेंगे; -) –

+0

@ रॉयनामिर जीसी उस प्रश्न से पूछेगा हालांकि –

3

जीसी

  • जीसी हैंडल में वस्तु जड़ों के लिए खोज (स्थैतिक चर रहे हैं जड़ों जो कर रहे हैं जी सी के रूप में अच्छी तरह से हैंडल्स)
  • सभी थ्रेड ढेर
  • CPU रजिस्टरों

में करता है आपका मामला आमतौर पर थ्रेड स्टैक के अंदर स्थित संरचना है और इसलिए खोजा जाता है। यदि यह बॉक्स किया गया है तो यह एक छद्म वस्तु के रूप में प्रबंधित ढेर पर रहता है। लेकिन आपको आश्वासन दिया जा सकता है कि इस बात को जीसी द्वारा सही ढंग से गिना जाता है। चूंकि इसमें कोई ऑब्जेक्ट होता है, यह अब एक विचित्र प्रकार नहीं है और PInvoke के माध्यम से अप्रबंधित कोड को पारित नहीं किया जा सकता है।

यदि आप एक स्ट्रक्चर पास करते हैं तो यह PCvokes के साथ एक समस्या है, अगर यह अनजान कॉल अभी भी प्रगति पर है, तो आपको जीसीड किया जाएगा, जो आपको केवल रिलीज बिल्ड में प्राप्त करता है क्योंकि डीबग बनाने के लिए चर के जीवनकाल तक बढ़ाया जाता है विधि छोड़ी गई है। रिलीज मोड में जीसी अधिक आक्रामक रूप से एकत्रित होता है।

संपादित 1: कक्षा वस्तुओं में सदस्यों के रूप में स्ट्रक्चर कोई विशेष मामला नहीं है। जीसी wil एम्बेडेड structs में कक्षा संदर्भ के लिए सभी वर्ग क्षेत्रों का निरीक्षण भी करेंगे।

+0

और अधिक है http://stackoverflow.com/questions/9938186/gc-roots- समझदारी –

0

संरचना प्रकार के भंडारण स्थान को डक ® ब्रांड चिपकने वाला टेप के साथ एकत्रित भंडारण स्थानों के संग्रह के रूप में सबसे अच्छा माना जा सकता है; उपरोक्त भंडारण स्थानों की प्रकृति संरचना की होगी। यदि ढेर पर एक संरचना संग्रहित की जाती है, तो इसके खेतों को ढेर पर रखा जाएगा; यदि संरचना एक हीप-ऑब्जेक्ट फ़ील्ड में संग्रहीत है, तो उसके फ़ील्ड उस ढेर ऑब्जेक्ट के हिस्से के रूप में संग्रहीत किए जाएंगे; आदि।यदि एक परिवर्तनीय भंडारण स्थान में एक स्ट्रक्चर संग्रहीत किया जाता है, तो इसके फ़ील्ड (सार्वजनिक या निजी) उत्परिवर्तनीय होंगे (भले ही संरचना उत्परिवर्तन के लिए प्रदान न करे, एक संरचना को दूसरे में कॉपी करना बाद में अपने क्षेत्रों को संबंधित क्षेत्रों के साथ ओवरराइट करके उत्परिवर्तित करेगा भूतपूर्व)। यदि एक अपरिवर्तनीय भंडारण स्थान में एक संरचना संग्रहीत की जाती है, तो इसके सभी फ़ील्ड अपरिवर्तनीय होंगे।

यदि आप उस फैशन में चीजें देखते हैं, तो यह समझना आसान होगा कि संरचना के जीसी व्यवहार अनिवार्य रूप से जीसी व्यवहार के समान ही हैं जो किसी को अलग-अलग क्षेत्रों के साथ संरचना को बदलकर प्राप्त करेंगे (केवल एक महत्वपूर्ण स्थान व्यवहार 'असामान्य' सरणी के साथ होता है, क्योंकि आम तौर पर एक सरणी स्लॉट फ़ील्ड के संग्रह के बजाय केवल एक आइटम रखता है; संरचना प्रकार की सरणी के बराबर कोई गैर-संरचना नहीं होती है)।

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