在仅包含值类型的自定义结构上使用Marshal.SizeOf()方法

enz*_*m83 3 .net c#

我创建了一个简单的结构,它由两个值类型组成.

public struct Identifier
{
    public Guid ID { get; set; }
    public Byte RequestType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我使用以下语句Marshal.SizeOf()在自定义结构上调用方法Identifier.

Identifier i = new Identifier();
Console.WriteLine(Marshal.SizeOf(i));   // output: 20
Console.WriteLine(Marshal.SizeOf(i.GetType()));   // output: 20
Run Code Online (Sandbox Code Playgroud)

为什么不Marshal.SizeOf()回17?以下指令显示Guid对象为16个字节,字节object为1个字节.

Guid g = Guid.NewGuid();
Console.WriteLine(Marshal.SizeOf(g));   // output: 16
Console.WriteLine(Marshal.SizeOf(g.GetType()));   // output: 16

Byte t = 0;
Console.WriteLine(Marshal.SizeOf(t));   // output: 1
Console.WriteLine(Marshal.SizeOf(t.GetType()));   // output: 1
Run Code Online (Sandbox Code Playgroud)

Guv*_*nte 6

默认情况下,允许CLR重新排列(对于简单的结构,它永远不会这样)和pad结构,因为它喜欢.这通常是为了在内存中使其与字边界对齐.

如果您不喜欢此行为并想要更改它,则可以指定不包装,如下所示:

[StructLayout(LayoutKind.Sequential,Pack=1)]
Run Code Online (Sandbox Code Playgroud)

  • 它不是编译器在内存中排列结构,而是CLR.并且Marshal.SizeOf在编组后将大小*返回到非托管内存*,而不是CLR安排的托管内存中的大小. (4认同)