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

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为例,优秀的结构体设计可以节省不少内存。
:修改完默认对齐数后别忘了改回去!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值