码迷,mamicode.com
首页 > Windows程序 > 详细

C#.NET结构体字节对齐[转载]

时间:2018-03-24 13:33:39      阅读:319      评论:0      收藏:0      [点我收藏+]

标签:改变   serial   必须   dll   ack   har   byte   sum   post   

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

C#.NET结构体字节对齐[转载]

标签:改变   serial   必须   dll   ack   har   byte   sum   post   

原文地址:https://www.cnblogs.com/YoungSpace/p/8638474.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!