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

Meh*_*Meh 10 c# struct sizeof

存储在一个List<DataPoint>?是12个字节还是16个字节?

public struct DataPoint
{
    DateTime time_utc;
    float value;
}
Run Code Online (Sandbox Code Playgroud)

C#中有任何sizeof函数吗?

Ste*_*end 14

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


Lou*_*nco 7

Marshal.SizeOf()

http://msdn.microsoft.com/en-us/library/y3ybkfb3.aspx

  • Marshal.SizeOf()确实*不*返回托管结构的大小,只返回它的非托管版本.检查史蒂夫的回答. (3认同)

dtb*_*dtb 7

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

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

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

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


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