当前位置:首页 > Windows程序 > 正文

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

2024-03-31 Windows程序

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

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/34051.html

Jm-杰米博客Jamie
草根站长的技术交流乐园!IT不会不要紧快来好好学习吧!
  • 20786文章总数
  • 7494588访问次数
  • 建站天数
  • 友情链接