C#.NET结构体字节对齐

  [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了。




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值