引用类型为c#的大小的奇怪行为

问题描述 投票:0回答:1

我发现了一些奇怪的行为,我想知道原因。考虑我们有以下课程

[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个字节?

c# reference size storage clr
1个回答
0
投票

运行小提琴中的第三种情况为我报告了8个字节。

pack attribute上的页面:

  • 类型的对齐方式是其最大元素的大小(1、2、4、8等,字节)或指定的包装大小,以较小者为准。
  • 在字段之间添加填充以满足对齐要求。

换句话说,在第三种情况下,该结构的对齐方式为4,因此将每个元素填充为该大小。您可以使用[StructLayout(LayoutKind.Sequential, Pack=1)]属性强制1字节对齐,而整个结构则采用5字节。

所有这些的原因是,在某些体系结构上,访问未对齐内存的速度可能较慢。

© www.soinside.com 2019 - 2024. All rights reserved.