C语言结构体对齐

文章介绍了结构体在内存中的对齐规则,包括成员对齐数的确定,结构体大小的计算方法,并通过举例说明了如何根据成员类型和默认对齐数来调整结构体的总大小。同时提到了#pragmapack指令用于改变编译器的默认对齐设置。
摘要由CSDN通过智能技术生成

注意

  • 不同编译器有各自默认对齐数,此处以默认对齐数为8个字节为例。
  • 结构体中每个成员有各自的成员对齐数即min(类型大小,默认对齐数)。
  • 参与对齐的成员只能是基础类型,若该成员是结构体嵌套则相当于把结构体展开讨论,若该成员是数组则该处对齐成员为数组的基本类型。
  • 可以使用#pragma pack()来改变编译器默认对齐数,且括号内只能填写2^n的数如1、2、4。

对齐规则

  • 结构体首个成员于结构体内存偏移量为0的位置开始存放,后续成员开始存放位置偏移量为整数倍的成员对齐数。
  • 结构体的大小为该结构体内最大成员对齐数的整数倍。

快速计算结构体大小

  • 连续的几个成员的对齐数之和若小于旁边一个成员的对齐数则在计算时这几个成员大小之和增加为旁边一个成员的对齐数。
  • 结构体大小=结构内所有成员大小之和+变化后对齐数增量。

代码

例1

在这里插入图片描述
根据公式:结构体大小=结构内所有成员大小之和+对齐数增加数。这里7个成员变量的大小为61,此处只有变量l+k<g,5变成8增量为3。
即:结构体大小=61+3=64。

例2

在这里插入图片描述
根据公式:结构体大小=结构内所有成员大小之和+对齐数增加数。这里包括嵌套内的成员变量的大小为67,此处增量为3。
即:结构体大小=67+3=70。

  • 例1因为默认对齐数大于等于结构内最大类型大小(这里是double类型8B),因此算的时候可以直接算。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值