C#GC मेमोरी ऑब्जेक्ट्स को स्थानांतरित कर सकता है




(3)

यह var हुए कि आप इसका उपयोग कर रहे हैं इसका मतलब है कि आप इसे एक विधि में परिभाषित कर रहे हैं। आपका चर बहुत कम समय के लिए उस पद्धति के संदर्भ में रहता है, और यह बहुत संभावना नहीं है कि जीसी इसे स्थानांतरित करेगा।

दूसरी तरफ जीसी मेमोरी खंडों को स्मृति विखंडन को कम करने के लिए स्थानांतरित करेगा ताकि हाँ यह आपके चर को स्थानांतरित कर सके। इसका सबसे अच्छा हिस्सा आप इसे नोटिस भी नहीं करेंगे क्योंकि यह आपके लिए वही पुराना "टैब" है।

यदि आप उस चर के स्थान को ठीक करना चाहते हैं, तो आप "निश्चित" का उपयोग कर सकते हैं।

मान लीजिए कि यह बहुत ही मूल C # कोड है:

var tab = new int[10];

मैंने पढ़ा है कि कचरा संग्रहकर्ता द्वारा गैर निश्चित चर को स्मृति में स्थानांतरित किया जा सकता है।

मेरा प्रश्न है: क्या यह संभव है कि मेरे कार्यक्रम निष्पादन के दौरान "टैब" पता बदल जाए?

मैं सिर्फ समझना चाहता हूं।

वास्तव में, कोई बात नहीं अगर टैब मूल्य बदल जाता है।


यह निश्चित है कि सरणी ऑब्जेक्ट को मेमोरी में स्थानांतरित किया जा सकता है।

लेकिन ध्यान दें कि आप किसी प्रबंधित संदर्भ ऑब्जेक्ट के पॉइंटर को प्राप्त नहीं कर सकते, या आप एक fixed ब्लॉक का उपयोग करते हैं, इसे जीसी द्वारा इसके भीतर स्थानांतरित नहीं किया जा सकता है।

यदि सरणी ऑब्जेक्ट को स्थानांतरित किया जाता है, तो चर tab से सरणी ऑब्जेक्ट तक का संदर्भ भी GC द्वारा तय किया जाता है, इसलिए आपके लिए GC द्वारा प्रभावित कुछ भी देखने का कोई तरीका नहीं होगा।


हाँ। tab का मेमोरी एड्रेस (और शायद सबसे अधिक होगा) बदला जा सकता है। संदर्भ: ECMA-334 C # भाषा विशिष्टता , अध्याय 23.4

मुद्दा यह है कि, c# आपको मेमोरी एड्रेस के बारे में परेशान होने की आवश्यकता नहीं है क्योंकि यह एक प्रबंधित भाषा है। tab चर के सभी संदर्भों को तदनुसार बदल दिया जाएगा, और आपका कार्यक्रम कचरा संग्रह को मूल रूप से जीवित रखेगा।




c#  

c#