1.对齐规则
结构体的内存大小是根据其内存对齐的结果计算得来的,对齐遵循以下规则:
1. 第一个成员在与结构体变量偏移量为0的地址处。
2. 其他成员变量要对齐到对齐数的整数倍的地址处。
(对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。)
3 .结构体的总大小位最大对齐数的整数倍。
2.计算演示
🍈代码
struct A
{
char ch;
short num1;
int num2;
};
struct B
{
char ch;
int num2;
short num1;
};
int main()
{
printf("%u %u", sizeof(struct A), sizeof(struct B));
}
🍐结果
可是结构体A和结构体B的内容是完全一样的,为什么计算出的大小不同?
🍑过程分析
注:VS中的默认对齐数为8
结构体A
1. 将char类型数据排在偏移量为0的位置,char的大小为1,对齐数取8(VS中的默认对齐数)和1的较小值为12.将short类型放到2的整数倍位置(2和8的较小值)
3.再将int类型放到4(4和 8的最小值)的整数倍位置。
同理结构体B占12字节,如下图所示:
3.修改默认对齐数
#pragma pack()
🥚例子
#pragma pack(8)//设置默认对齐数为8
#pragma pack(1)//设置默认对齐数为1
#pragma pack()取消设置的默认对齐数,还原为默认
用处:让程序员能够更好的设计结构体就以上面同样内容的结构体A和B为例,优秀的结构体设计可以节省不少内存。
注:修改完默认对齐数后别忘了改回去!
本文含有隐藏内容,请 开通VIP 后查看