如果一个结构包含一个char和一个int

时间:2021-10-26 03:03:55

[StructLayout(LayoutKind.Sequential,   CharSet=CharSet.Ansi)]   
  internal   struct   DllInvoices   
  {   
  [MarshalAs(UnmanagedType.ByValArray,   SizeConst=8)]   
  public   byte[]   serial;   
  public   byte   Type;   
  public   uint   Sum;   
  }   
  挪用Marshal.SizeOf(typeof(DllInvoices ))得到的巨细为16,,为什么不是13?

       这其实是体系布局和汇编的问题。   

在内存里特定类型数据的起始地点凡是有必然的对齐要求,好比说32位机器上的int起始地点必需是4的整数倍,布局凡是也是如此。   
       如果一个布局包罗一个char和一个int,那么char作为布局体的第一个字段,需要在4的整数倍地点开始,而int有同样的要求,所以char之后必需空出3个字节来,才华使int的地点满足对齐的要求。   
    
       .NET的CLR是基于32位的,所以也由上述要求。在你的byte之后,必需空出3个字节。所以

功效就是16个字节了。

可以通过StructLayout的Pack属性转变这种对齐设置——如果有须要的话:   
       [StructLayout(LayoutKind.Sequential,   CharSet=CharSet.Ansi,Pack=1)]  功效就是13了。