坑二:字节对齐
时间:2022-04-28 21:12:01 | 来源:行业动态
时间:2022-04-28 21:12:01 来源:行业动态
对于C 开发者来说,可能知道当一个数据结构(class or struct)中的各字段在内存中进行排列时,会按照一个设定的装箱长度进行字节对齐,例如:
structMyStruct{intone;shorttwo;intthree;boolfour;}
假设在我们的平台上,sizeof(int)=4, sizeof(short)=2, sizeof(bool)=1, 如果问你sizeof(MyStruct)=?,你可能会马上做个加法得到答案,但是答案不一定对。It depends! 假设我们是按照4个字节对齐,这上面的结构体在内存中实际排列如下图:
了解这个对于我们编码有两个意义:
1、通过合理排列字段声明顺序来优化存储效率,内存布局中不留空洞;
2、MarshalAsAttribute支持Layout.Explicit来进行绝对定位,懂得了字节对齐可以配合Unmanaged侧的内存排列规则以保证字段长度映射正确,不然同样会发生字段长度不一致带来的困扰。