2010-06-16 8 views
17

.NET में किसी जटिल ऑब्जेक्ट के कुल आकार को निर्धारित करने के तरीके हैं? यह वस्तु अन्य वस्तुओं से बना है और अन्य जटिल वस्तुओं के संदर्भ रख सकती है। इस वस्तु द्वारा encapsulated कुछ वस्तुओं पीओडी हो सकता है, अन्य शायद नहीं हो सकता है।.NET में जटिल ऑब्जेक्ट के आकार को निर्धारित करने के तरीके?

+1

ऑब्जेक्ट्स serializable हैं? –

+0

वे हो सकते हैं :) अस्पष्ट होने के लिए खेद है, लेकिन मैं इस प्रश्न को यथासंभव सामान्य बनाने की कोशिश कर रहा हूं। – Polaris878

+0

सी #/.NET संदर्भ में "पीओडी" क्या है? यह एक सी ++ शब्द है ... –

उत्तर

10

आपके पास "जटिल वस्तु" नहीं है, यह एक ऑब्जेक्ट ग्राफ़ है। अपने कुल आकार को निर्धारित करने के लिए, आपको उस ग्राफ़ को चलने की आवश्यकता है - कुछ रूट ऑब्जेक्ट से शुरू करना, और संदर्भ प्रकारों के फ़ील्ड को गिनने और उनके मानों को पुनर्प्राप्त करने के लिए प्रतिबिंब का उपयोग करना (और निश्चित रूप से लूप की जांच करना)।

ग्राफ़ में किसी विशेष ऑब्जेक्ट का आकार प्राप्त करने के लिए, this answer to a related question देखें, लेकिन ध्यान दें कि यह एक बुरा हैक है, पूरी तरह असमर्थित है, तोड़ सकता है (और पहले ही टूटा जा सकता है), और इसके परिणामस्वरूप थोक बिल्ली का बच्चा नरसंहार हो सकता है स्वर्गीय क्षेत्रों उस ने कहा, सटीक मूल्य प्राप्त करने के लिए कोई "गैर-हैकी" तरीका नहीं है, क्योंकि यह परिभाषा द्वारा कार्यान्वयन विवरण है - इसके लिए आपके पास कोई उपयोग नहीं होना चाहिए। और डीबगिंग/प्रोफाइलिंग के दौरान ऐप के मेमोरी उपयोग को खोजने के उद्देश्य से, हैक काफी अच्छा है।

+0

धन्यवाद पावेल। जब मैंने सवाल पूछा, तो मैं जटिलताओं को समझ गया, मैं सिर्फ उत्सुक था कि अगर कोई पहले से ही ऑब्जेक्ट ग्राफ़ ट्रैवर्सल बना चुका है जिसने इसकी गणना की है :) – Polaris878

1

System.Runtime.InteropServices.Marshal.SizeOf() एक शॉट दें।

+0

'मार्शल.SizeOf()' subobjects के आकार को ध्यान में नहीं रख सकता है। – drharris

+0

ध्यान रखें कि यह एक सुरक्षा महत्वपूर्ण कार्य है, इसलिए दुर्भाग्यवश कई संदर्भों में काम नहीं करता है। –

+1

यह वस्तु के मार्शल प्रतिनिधित्व का आकार देता है, जो काफी समान नहीं है। –

2

ट्रिकी ...

क्या होगा यदि दो वस्तुओं एक ही स्ट्रिंग चर को इंगित। स्ट्रिंग का कौन सा "मालिक" है? यह मुझे लगता है कि आपको एक सही जवाब प्राप्त करने के लिए एक कचरा संग्रह अनुकरण करने की आवश्यकता है। बिल्कुल हल्के वजन नहीं।

+0

स्ट्रिंग यहां एक अच्छा उदाहरण नहीं है क्योंकि यह अपरिवर्तनीय है। –

+2

@ पॉल: अपरिवर्तनीयता को इसके साथ क्या करना है? मुद्दा यह है कि किसी ऑब्जेक्ट को उस स्ट्रिंग का संदर्भ हो सकता है जो इसे बाहर से दिया गया है (उदा। एक फ़ाइल नाम)। क्या वह स्ट्रिंग ऑब्जेक्ट से "संबंधित" है या नहीं? इसे अपने आकार के हिस्से के रूप में गिना जाना चाहिए या नहीं? –

4

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

मूल्य प्रकारों के लिए, आप Marshal.SizeOf() का उपयोग करेंगे, केवल यह किसी भी उप-प्रोजेक्ट को ध्यान में रखता नहीं है। यह सूचकांक के आकार के रूप में किसी भी आंतरिक संदर्भ प्रकार की गणना करेगा।

प्रतिबिंब एक और तरीका है, लेकिन किसी भी निजी सदस्यों को स्मृति लेने का खुलासा नहीं करेगा। इसलिए, जब तक कि मैं गलत नहीं हूं, वास्तव में ऐसा करने का कोई तरीका नहीं है।

1

पहले StackOverflow पर कहीं और उत्तर दिया:

Find size of object instance in bytes in c#

आप (सूचक इस के लिए आवश्यक कार्रवाई की वजह से) असुरक्षित कोड लागू करने के लिए की जरूरत है - कोड इस तरह दिखता है:

static unsafe int CalcSize(object obj) 
{ 
    RuntimeTypeHandle th = obj.GetType().TypeHandle; 
    int size = *(*(int**)&th + 1); 
    return size; 
} 

यह भी याद रखें प्रोजेक्ट सेटिंग्स (प्रोजेक्ट-> बिल्ड टैब) को "असुरक्षित कोड की अनुमति दें" पर चिह्नित करने के लिए।

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