डिफ़ॉल्ट रूप से सी # में सभी struct
एस [StructLayout(LayoutKind.Sequential)]
-मार्क मूल्य प्रकार के रूप में माना जाता है।सीएलआर क्रमिक structs लेआउट: संरेखण और आकार
using System;
using System.Reflection;
using System.Linq;
using System.Runtime.InteropServices;
class Foo
{
struct E { }
struct S0 { byte a; }
struct S1 { byte a; byte b; }
struct S2 { byte a; byte b; byte c; }
struct S3 { byte a; int b; }
struct S4 { int a; byte b; }
struct S5 { byte a; byte b; int c; }
struct S6 { byte a; int b; byte c; }
struct S7 { int a; byte b; int c; }
struct S8 { byte a; short b; int c; }
struct S9 { short a; byte b; int c; }
struct S10 { long a; byte b; }
struct S11 { byte a; long b; }
struct S12 { byte a; byte b; short c; short d; long e; }
struct S13 { E a; E b; }
struct S14 { E a; E b; int c; }
struct S15 { byte a; byte b; byte c; byte d; byte e; }
struct S16 { S15 b; byte c; }
struct S17 { long a; S15 b; }
struct S18 { long a; S15 b; S15 c; }
struct S19 { long a; S15 b; S15 c; E d; short e; }
struct S20 { long a; S15 b; S15 c; short d; E e; }
static void Main()
{
Console.WriteLine("name: contents => size\n");
foreach (var type in typeof(Foo).GetNestedTypes(BindingFlags.NonPublic))
{
var fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
Console.WriteLine("{0}: {2} => {1}", type.Name, Marshal.SizeOf(type),
string.Join("+", fields.Select(_ => Marshal.SizeOf(_.FieldType))));
}
}
}
आउटपुट है (x86/x64 पर एक ही):
name: contents => size
E: => 1
S0: 1 => 1
S1: 1+1 => 2
S2: 1+1+1 => 3
S3: 1+4 => 8
S4: 4+1 => 8
S5: 1+1+4 => 8
S6: 1+4+1 => 12
S7: 4+1+4 => 12
S8: 1+2+4 => 8
S9: 2+1+4 => 8
S10: 8+1 => 16
S11: 1+8 => 16
S12: 1+1+2+2+8 => 16
S13: 1+1 => 2
S14: 1+1+4 => 8
S15: 1+1+1+1+1 => 5
S16: 5+1 => 6
S17: 8+5 => 16
S18: 8+5+5 => 24
S19: 8+5+5+1+2 => 24
S20: 8+5+5+2+1 => 24
इस परिणाम पर मैं नहीं समझ सकता देख रहे हैं तो struct
रों की कुछ संख्या ले और इस struct
एस के आकार का निरीक्षण करने देता है लेआउट (फ़ील्ड संरेखण और कुल आकार) नियमसेट सीएलआर अनुक्रमिक structs के लिए उपयोग किया जाता है। क्या कोई मुझे इस व्यवहार की व्याख्या कर सकता है?
क्या आप प्रबंधित अंतरिक्ष में structs के लिए सीएलआर द्वारा उपयोग किए जाने वाले नियमों के लिए पूछ रहे हैं (जो एक कार्यान्वयन विस्तार है) या मार्शलर द्वारा उपयोग किए जाने वाले नियमों को प्रबंधित करते हैं जब प्रबंधित एक अप्रबंधित स्थान के बीच structs को मार्शल करते हैं (मार्शल.SizeOf एक संरचना का आकार देता है marshalling के बाद, प्रबंधित अंतरिक्ष में संरचना की नहीं)? – dtb
इसे थोड़ा सा संक्षिप्त करें, कौन से विशेष परिणाम अप्रत्याशित हैं? अनुक्रमिक लेआउट के साथ –
@ डीटीबी यह दो चीजें पूरी तरह से समान हैं। 'मार्शल .इज़ऑफ() 'पूरी तरह से वही आकार देता है, क्योंकि सी #' आकार का ऑपरेटर रिटर्न देता है। – ControlFlow