2016-03-12 10 views
5

में एक संरचना का अतिरिक्त आकार देता है मैं आकार के ऑपरेटर का उपयोग कर अपने सभी चर (मान प्रकार) का आकार जांचने की कोशिश कर रहा हूं। मैं msdn article में से एक है, जहां यह लिखा है किआकार का ऑपरेटर सी #

structs सहित अन्य सभी प्रकार के लिए,, sizeof ऑपरेटर केवल असुरक्षित कोड ब्लॉक

और भी structs किसी भी शामिल नहीं होना चाहिए में इस्तेमाल किया जा सकता के माध्यम से चला खेतों या गुण है कि संदर्भ प्रकार के होते हैं

इस के लिए, मैं इस प्रकार

struct EmployeeStruct 
{ 
    int empId; 
    long salary;  
} 
के रूप में अपने प्रोजेक्ट गुण में असुरक्षित संकलन और बनाया संरचना सक्षम 10

और इस प्रकार

unsafe 
{ 
    size = sizeof(EmployeeStruct); 
} 

Console.WriteLine("Size of type in bytes is: {0}", size); 

रूप में इस्तेमाल किया यहाँ मैं बाइट में प्रकार के आकार के रूप में उत्पादन कर रहा है हो रही है: 16 तथापि संरचना को देखकर यह होना चाहिए 12 (पूर्णांक के लिए 4 और 8 लंबे समय के लिए)। क्या कोई मुझे यहां समझने में मदद कर सकता है कि मुझे 4 बाइट अतिरिक्त आकार क्यों मिल रहा है?

+0

आपके द्वारा दिए गए लिंक से आपको पता चलता है: "जबकि आकार सामान्य आकार के रनटाइम द्वारा आवंटित किया गया है, ** ** किसी भी पैडिंग ** ** – DavidG

+0

@ यूजीन पॉडस्कल में यह बहुत कुछ बदलता है - जो लोग उत्तर की तलाश में हैं सी # पर एक समस्या सी के बारे में प्रश्नों को नहीं देखेगी, वे बहुत अलग भाषाएं हैं, भले ही जवाब वही है। –

+0

@GediminasMasaitis फिर उन्हें यह प्रश्न मिलेगा और डुप्लिकेट पढ़ा जाएगा (ठीक है, कम से कम उन्हें चाहिए)। लेकिन अगर आपको लगता है कि यह प्रयास के लायक है, तो आप उचित कैननिकल सी #-विशिष्ट उत्तर लिख सकते हैं। उस स्थिति में मैं आपको इस प्रश्न का नाम अधिक आसानी से खोजने योग्य और टू-द-पॉइंट "आकार से अधिक रिटर्न मान का आकार बदलने के लिए" या उस पंक्ति के साथ कुछ नाम बदलने की भी सिफारिश करता हूं। डेविड जी टिप्पणी के लिए –

उत्तर

1

आपको असुरक्षित कोड का उपयोग करने की आवश्यकता नहीं है। System.Runtime.InteropServices.Marshal.SizeOf()

उदाहरण के लिए: मार्शल.SizeOf (नया कर्मचारी संरचना());

कि वापसी 12 के बजाय 16 है, क्योंकि स्मृति में डिफॉल्ट पैक आकार 8.

तो, के लिए:

struct EmployeeStruct 
{ 
    int empId; // 4 bytes 
    long salary; 8 bytes 
} 

// वापसी 16 के बजाय 12 (क्योंकि डी मिनट इकाई है 8)

के लिए:

struct EmployeeStruct 
{ 
    int empId; // 4 bytes 
    int empAge; // 4 bytes 
    long salary; 8 bytes 
    } 

// वापसी 16 भी

+०१२३५१६४१०

और के लिए

struct EmployeeStruct 
    { 
     int empId; // 4 bytes 
     int empAge; // 4 bytes 
     int IdCompany; // 4 bytes 
     long salary; 8 bytes 
    } 

वापसी 24 के बजाय 20 (क्योंकि डी मिनट इकाई है 8)

मैं आप क्या चाहते हैं पता नहीं है, लेकिन यदि आप प्रत्येक क्षेत्र आकार की राशि की जरूरत है, आप कर सकते हैं जैसे

public int SizeOf(Type t) 
    { 
     int s = 0; 
     var fields = t.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic); 
     foreach (var f in fields) 
     { 
      var x = f.FieldType; 
      s += x.IsPrimitive ? Marshal.SizeOf(x) : SizeOf(x); 
     } 

     return s; 
    } 

यह रिटर्न 12 के बजाय 16, अपने मामले के लिए, और आप जटिल संरचनाओं के लिए उपयोग कर सकते हैं,: इस समारोह के साथ प्रयास करें

struct EmployeeStruct 
    { 
     int field1; // 4 bytes 
     long field2; // 8 bytes 
     Person p; // 12 bytes 
    } 

    struct Person 
    { 
     int field1; // 4 bytes 
     long field2; // 8 bytes 
    } 

आकारऑफ (टाइपऑफ (कर्मचारी संरचना) 32 के बजाय 24 लौटाएगा, लेकिन याद रखें, स्मृति पर वास्तविक आकार 32 है, संकलक स्मृति को असाइन करने के लिए 32 बाइट्स का उपयोग करता है।

सम्मान।

+0

लेकिन फिर तीन 'int' वाली संरचना का आकार 12 और 16 नहीं है? –

+0

थेंक्स गोंजालो। लेकिन यह सच नहीं है कि System.Runtime.InteropServices.Marshal.SizeOf मर्सहेलिंग के बाद अप्रबंधित आवंटित आकार देता है? क्या हमारे पास सही प्रबंधित या सीएलआर आवंटित आकार प्राप्त करने का कोई तरीका नहीं है? –

+0

मैंने अपना जवाब संपादित किया, शायद मैं आपकी मदद कर सकता हूं। सादर। – Gonzalo

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