一、结构体对齐规则
1.第一个成员在于结构体变量偏移量为0的地址处;
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处;
3.结构体总大小为最大对齐数(每个成员变量都有对齐数)的整数倍;
4.如果嵌套了结构体的情况,潜逃的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
对齐数:编译器默认的一个对齐数 与 该成员大小的较小值
二、结构体内存对齐例题
struct Test{
char a;
short b;
int c;
double d;
int e;
short f;
char g;
}
a的对齐数是1
b的对齐数是2
c的对齐数是4
d的对齐数是8
e的对齐数是4
f的对齐数是2
g的对齐数是1 共占据24字节
绿色框表示结构体占据的内存,红色斜线表示浪费的内存,浪费这个内存是为了提高硬件的执行效率。因为CPU从内存中读取数据的时候不是一个字节一个字节的读
struct Test{
char a;
double b;
char c;
double d;
}
共占据32字节
三、其他
1.修改默认字节对齐数
通过#pragma pack()
写跨平台程序一般需要手动指定对齐数,否则平台默认对齐数不同会引起结构体内存布局不同引入bug
2.enum
c语言中enumerate和int是等价的,枚举的目的只是为例代码的可读性更好。
enum表示的含义:可以穷举出来的概念
枚举默认从0开始
enum例题
enum{
X,
Y,
Z = 255,
A,
B,
}
enum enumA = Y;
enum enumB = B;
Y和B应该分别为1, 257
枚举默认从0开始,则X是0 Y是1, 因为Z是255,所以A是256则B为257
3.union
联合体的各种成员,共用一块内存空间。
内存按照占字节数最多的来算