के बीच सीएलआर ऑब्जेक्ट आकार को समझना मैं 32 बिट और 64 बिट प्रोसेसर के बीच ऑब्जेक्ट आकार अंतर को समझने की कोशिश कर रहा हूं। मान लीजिए कि मैं एक साधारण वर्ग32 बिट बनाम 64 बिट
class MyClass
{
int x;
int y;
}
एक 32 बिट मशीन पर
तो करते हैं, एक पूर्णांक 4 बाइट है। अगर मैं इसमें सिंकब्लॉक जोड़ता हूं (एक और 4 बाइट्स), ऑब्जेक्ट का आकार 12 बाइट होगा। यह 16 बाइट क्यों दिखा रहा है?
0:000> !do 0x029d8b98 Name: ConsoleApplication1.Program+MyClass MethodTable: 000e33b0 EEClass: 000e149c Size: 16(0x10) bytes (C:\MyTemp\ConsoleApplication1\ConsoleApplication1\bin\x86\Debug\ConsoleApplication1.exe) Fields: MT Field Offset Type VT Attr Value Name 71972d70 4000003 4 System.Int32 1 instance 0 x 71972d70 4000004 8 System.Int32 1 instance 0 y
एक 64 बिट मशीन पर, एक पूर्णांक अब भी है 4 बाइट केवल एक चीज बदल कि Syncblock 8 बाइट्स हो जाएगा (के रूप में संकेत दिए गए 64 बिट मशीनों पर 8 बाइट्स हैं)। इसका मतलब है कि वस्तु का आकार 16 बाइट होगा। यह 24 बाइट क्यों दिखा रहा है?
0:000> !do 0x00000000028f3c90 Name: ConsoleApplication1.Program+MyClass MethodTable: 000007ff00043af8 EEClass: 000007ff00182408 Size: 24(0x18) bytes (C:\MyTemp\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe) Fields: MT Field Offset Type VT Attr Value Name 000007fef4edd998 4000003 8 System.Int32 1 instance 0 x 000007fef4edd998 4000004 c System.Int32 1 instance 0 y
संरेखित या नहीं, आकार अभी भी वस्तु के वास्तविक आकार को प्रतिबिंबित करना चाहिए। पैडिंग केवल आकार की ओर गिना जाएगा यदि यह सदस्यों के बीच था, जो यहां मामला नहीं लगता है। – cHao
ऑब्जेक्ट के बाहर किसी भी ओवरहेड के बारे में विवरण इस मामले में वास्तव में प्रासंगिक नहीं हैं। उस ओवरहेड का अधिकांश भाग वस्तु में ऑब्जेक्ट टेबल में होता है, ऑब्जेक्ट पर नहीं। – cHao