当前位置: 代码迷 >> 综合 >> [StructLayout(LayoutKind.Sequential, Pack =1)]解释
  详细解决方案

[StructLayout(LayoutKind.Sequential, Pack =1)]解释

热度:8   发布时间:2023-12-13 22:18:37.0

[StructLayout(LayoutKind.Sequential)]

结构体是由若干成员组成的.布局有两种
1.Sequential,顺序布局,比如
struct S1
{int a;int b;
}
那么默认情况下在内存里是先排a,再排b
也就是如果能取到a的地址,和b的地址,则相差一个int类型的长度,4字节
[StructLayout(LayoutKind.Sequential)] 
struct S1
{int a;int b;
}
这样和上一个是一样的.因为默认的内存排列就是Sequential,也就是按成员的先后顺序排列.
2.Explicit,精确布局
需要用FieldOffset()设置每个成员的位置
这样就可以实现类似c的公用体的功能
[StructLayout(LayoutKind.Explicit)] 
struct S1
{[FieldOffset(0)]int a;[FieldOffset(0)]int b;
}
这样a和b在内存中地址相同StructLayout特性支持三种附加字段:CharSet、Pack、Size。     

·   CharSet定义在结构中的字符串成员在结构被传给DLL时的排列方式。可以是Unicode、Ansi或Auto。     
  默认为Auto,在WIN   NT/2000/XP中表示字符串按照Unicode字符串进行排列,在WIN   95/98/Me中则表示按照ANSI字符串进行排列。     
·   Pack定义了结构的封装大小。可以是1、2、4、8、16、32、64、128或特殊值0。特殊值0表示当前操作平台默认的压缩大小。     

  相关解决方案