我创建了一个简单的结构,它由两个值类型组成。
public struct Identifier
{
public Guid ID { get; set; }
public Byte RequestType { get; set; }
}
然后我使用以下语句在自定义结构Marshal.SizeOf()
上调用Identifier
方法。
Identifier i = new Identifier();
Console.WriteLine(Marshal.SizeOf(i)); // output: 20
Console.WriteLine(Marshal.SizeOf(i.GetType())); // output: 20
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
答案 0 :(得分:6)
默认情况下,CLR可以重新排列(对于简单的结构,它永远不会这样),并且可以随意填充结构。这通常是为了在内存中使其与字边界对齐。
如果您不喜欢此行为并想要更改它,则可以按如下方式指定不打包:
[StructLayout(LayoutKind.Sequential,Pack=1)]
答案 1 :(得分:3)
出于对齐原因,当复制到非托管内存时,Identifier
结构填充3个字节。