C++内存对齐总结 - Chandler Qian - 博客园 https://www.cnblogs.com/zrtqsk/p/4371773.html
规则
1、第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、在数据成员完成各自对齐之后,类(结构或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
很明显#pragma pack(n)作为一个预编译指令用来设置多少个字节对齐的。值得注意的是,n的缺省数值是按照编译器自身设置,一般为8,合法的数值分别是1、2、4、8、16。
即编译器只会按照1、2、4、8、16的方式分割内存。若n为其他值,是无效的。
位域表示法
加类型,表示在这个类型上分配
比较:
struct packet_bit
{
unsigned char a:2;
unsigned char b:3;
}bit;
这样bit只在一个字节 unsigned char内分配,未分配3位!!szieof(bit)=1
struct packet_bit
{
unsigned int a:2;
unsigned int b:3;
}bit;
则在四字节unisgned int内分配,其它未分配的27位!!!szieof(bit)=4!