结构体大小计算--结构体内存对齐

发布于:2023-02-14 ⋅ 阅读:(820) ⋅ 点赞:(0)

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的较小值为1

2.将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 后查看