结构体大小
- 结构体对齐基准(以下两者最小值)
- 结构体中最宽基本类型;(数组或内嵌结构体相当于展开)
- 预编译指令
#pragma pack (n)
手动设置 n-- 只能填 1 2 4 8 16;
- 结构体的总大小为结构体对齐基准大小的整数倍;
- 按照首地址开始累进,不足对齐基准先和后面组合,<对齐基准则组合,不行,则系统填充;
- 类或结构体的静态成员变量不占用结构体或类的空间,也就是说 sizeof 出来的大小跟静态成员变量的大小无关;
- 作为成员变量的结构体的偏移量必须是 自己最大成员类型字节长度的整数倍;(不考虑其他成员变量!!)
struct ss0{
char a[15]; //占15个字节,从0开始偏移,所以下面的int是从15开始偏移
int x;//偏移量 0x15+1=16
}s1;
cout<<sizeof(s1)<<endl; //结果为20字节
struct ss1
{
char a[15]; //
int x; //偏移量 16字节
char b; //偏移量 21字节
}s2; //结果为21字节,按最大基本类型对齐,补充到24字节
cout<<sizeof(s2)<<endl; //结果为24字节
struct ss2
{
char a[15];
int x; //偏移量 16字节
double b; //偏移量 24字节
char c;//偏移量 32字节
}s3;//共33字节,按最大基本类型对齐,补充到40字节(整除8)
cout<<sizeof(s3)<<endl; //结果为40字节
struct
{
char a; //偏移0,1字节
struct ss0 b;//偏移1+3=4,20字节
char f;//偏移24, 1字节
struct ss1 c;//偏移25+3,24字节
char g;//偏移52,1字节
struct ss2 d;//偏移53+3,40字节
char e;//偏移96,1字节
}s7;//共97字节,不能整除sizeof(double),所以补充到104字节
cout<<"here:"<<sizeof(s7)<<endl;
reference
1.关于结构体占用空间大小总结
2.三步解决 C 语言中 struct 字节对齐问题