我创建了一个简单的结构,它由两个值类型组成.
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)
默认情况下,允许CLR重新排列(对于简单的结构,它永远不会这样)和pad结构,因为它喜欢.这通常是为了在内存中使其与字边界对齐.
如果您不喜欢此行为并想要更改它,则可以指定不包装,如下所示:
[StructLayout(LayoutKind.Sequential,Pack=1)]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4982 次 |
| 最近记录: |