这个C#结构的大小是多少?

存储在List时是12个字节还是16个字节?

 public struct DataPoint { DateTime time_utc; float value; } 

C#中有任何sizeof函数吗?

看看@Hans Passant的答案,了解这个问题的有趣背景,尤其是 关于Marshal.Sizeof的局限性。

CLR可以根据需要在内存中自由布局类型。 因此不可能直接给出“尺寸”。

但是,对于结构,可以使用StructLayout属性限制CLR的自由度:

  • 自动 :运行时自动选择适当的布局。
  • 顺序 :对象的成员按顺序排列,并根据StructLayoutAttribute.Pack值进行对齐。
  • 明确 :明确控制每个成员的准确位置。

C#编译器自动将Sequential布局类型应用于任何结构。 在x86或x64计算机上, Pack值分别默认为4或8。 所以你的struct的大小是8 + 4 = 12(x86和x64都是)。


类型在内存中的布局无关 ,也可以使用Marshal类在.NET中封送类型。 编组器在编组类型时会应用多个转换,因此结果并不总是与CLR布局类型的方式相同。 (例如, bool在内存中占用1个字节加上对齐,而marshaller将bool编组为4个字节。)

它将是12个字节(浮点数为4,DateTime为8); Marshal.SizeOf将返回16,因为默认打包是8字节对齐。 这是关于结构和包装的好文章。 它完整​​地描述了实际发生的事情。

试试Marshal.SizeOf(typeof(DataPoint))