结构体在存储的时候,会根据内部数据的数据类型开辟空间,但是按照相邻的数据成员变量的最大对齐方式进行字节对齐,并且影响整个结构体的空间大小
比如:
struct Demo1 {
char c;
short s;
int i;
};
struct Demo2 {
int i;
short s;
char c;
};
struct Demo3 {
char c;
int i;
short s;
};
这三个结构体个占用多少个字节?现在用 sizeof() 关键字去验证一下:
为什么都是一个char、一个short、一个int,但是所占用空间会不同?那他们在内存中是怎么分布的?
以上是 Demo1、Demo2、Demo3 开辟内存的方式,因为结构体在开辟空间的时候需要遵循变量对其原则,即:
对齐原则1
char 占一个字节,随便存
short 占两个字节,存储的起始地址必须是2的倍数,也就是二进制位最后一位必须是0
int 占四个字节,存储的起始地址必须是4的倍数,也就是二进制位最后两位必须是00
对齐原则2
那么每次开辟空间开辟的都是按照最大的基本数据类型的倍数开
如果结构体内有结构体,则里面的结构体按照同样的类型和该结构体内的基本数据类型比较,开辟空间按照最大的数据类型的倍数开辟
比如 Demo4:最大基本数据类型是int,即使下面数组占5个字节,也要给它开辟8个空间,连同int本身共占12个
Demo5:因为Demo4 最大是int,也就是四个字节,而且比char a要大,所以开辟的空间是4的倍数,12 + 4 = 16
对齐原则3
用 #pragma pack( num ) 自定义最大对齐字节
可以填充值位 0 1 2 4 8 ……
0 表示采用默认字节对齐方式
设置值大于默认字节对齐方式,则采用默认字节对齐方式;
每次设置之后,在下一次使用的采用新的字节对齐
系统的默认最大字节对齐方式:
32位系统中,默认最大以4字节对齐;
64位系统中,默认最大以8字节对齐