我发现了一些奇怪的行为,我想知道原因。考虑我们有以下课程
[StructLayout(LayoutKind.Sequential)]
Class A
{
}
[StructLayout(LayoutKind.Sequential)]
Class Test
{
A a;
}
和..
int size = Marshal.SizeOf(typeof(Test))
在这种情况下,size = 1,因此我可以猜测a为1个字节。当我以这种方式更改Test类时
[StructLayout(LayoutKind.Sequential)]
Class Test
{
int a;
}
大小= 4字节,与int类型一样。
但是当我把它们放在一起时,我希望大小将为4 + 1 = 5bytes。但我明白了
[StructLayout(LayoutKind.Sequential)]
Class Test
{
A a;
int x;
}
大小=16。我想知道为什么在这种情况下int占用8个字节?
运行小提琴中的第三种情况为我报告了8个字节。
从pack attribute上的页面:
- 类型的对齐方式是其最大元素的大小(1、2、4、8等,字节)或指定的包装大小,以较小者为准。
- 在字段之间添加填充以满足对齐要求。
换句话说,在第三种情况下,该结构的对齐方式为4,因此将每个元素填充为该大小。您可以使用[StructLayout(LayoutKind.Sequential, Pack=1)]
属性强制1字节对齐,而整个结构则采用5字节。
所有这些的原因是,在某些体系结构上,访问未对齐内存的速度可能较慢。