今天看视屏看到结构体的存储问题时
视频中 struct A { short a; char b; float c; double d; }
structB { short a; float c; char b;double d; }
两个结构体占用字节数分别是16 和24 ;但是视频中没有说清楚,自己查了下结构体的存储,分享下结果;
结构体存储时对齐分两个步:
这里我们认为pragama pack没有定义 无视他
1)结构体成员的对齐
此时对齐模数是当前要对齐的结构体成员的长度和【#pragma pack】中较小的那个
structA: a占用 2字节;
b是char 1个字节 已经对齐 所以a到b是3字节;
c是float 占用4字节,但是之前a到b只占用了3字节,前面要补齐一个 ,所以a~c占用4+4=8个字节
d是double 占用8字节 a~c也是8ge 无需对齐 所以整体占用8+8=16个字节
structB: a占用 2字节;
b是float 4个字节 没有对齐 所以a之后要补2个字节 所以a到b是2+2+4=8个字节;
c是char 占用1字节,已经对齐,所以a~c占8+1=9个字节
d是double 占用8字节 a~c是9个字节 对齐需补足7个字节 所以 a~d要占用9+7+8=24个字节
2)结构体整体的对齐
此时对齐模数是当前要(所有结构体成员中最长的)和【#pragma pack】中较小的那个
A和B都已经对齐,这个步骤其实很简单 就看步骤1得到的能不能被最长的整除 不能就补;可以的话就不用了。
|
|