详解结构体内存对齐

本文详细介绍了结构体内存对齐的概念、规则,以及如何计算结构体大小。通过实例展示了VS环境下结构体的内存布局,并探讨了内存对齐的原因,包括平台移植和性能考虑。此外,还讨论了如何修改默认对齐数,以及如何通过offsetof函数获取成员的偏移量。
摘要由CSDN通过智能技术生成

目录

结构体内存对齐的概念

 结构体内存对齐的规则

 结构体大小的计算

第一步:确定每个成员变量的对齐数

 第二步:定位

 第三步:确定该结构体的大小

结构体为什么要内存对齐

VS下修改默认对齐数 

调整结构体大小

offsetof函数的使用


结构体内存对齐的概念

 定义一个结构体变量

struct S
{
	char c1;//1
	int i;//4
	char c2;//1
};


int main()

	printf("%d\n", sizeof(struct S));

	return 0;
}

请问sizeof(struct S)是多大呢?有小伙伴会说无非就是把内部成员各自的大小加起来:1+4+1=6,因此答案就是6,可惜答案不是这个,而是12。

为啥相差这么大呢?因为结构体内的成员之间在内存中的位置并不是紧挨在一起的。

 即不是这样的:

 而是这样的:

 一个格子代表一个字节的大小,从图中也看不出12是哪里来的,大家细细的往下看

 这些成员进行了内存对齐,即按照某种规则将这些成员在内存中的位置进行了调整,这种规则称之为结构体内存对齐。内存对齐后其外在表现就是struct S这个结构体类型的大小就会发生改变,也就是说结构体大小遵循结构体内存对齐规则

 结构体内存对齐的规则

1.第一个成员在与结构体变量偏移量为0的地址处。
2.其他成员变量要对齐到自身对齐数的整数倍的地址处
        每个成员的对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
        VS中默认的值为8(这个值可以进行修改)
        linux没有默认值,直接以该成员大小为对齐数
3.结构体总大小为最大对齐数(从每个成员变量的对齐数中挑选)的整数倍。
4.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪孤儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值