C语言 结构体内存对齐规则

本文介绍了C语言中结构体的内存对齐规则,包括数据成员对齐、结构体作为成员的对齐以及位域的内存对齐。结构体的大小必须是其内部最大成员的整数倍,位域的存储则会根据编译器和类型有不同的对齐策略。内存对齐对于平台移植和性能优化具有重要意义。
摘要由CSDN通过智能技术生成

  在计算结构体类型变量的大小时,就涉及到了内存对齐问题。

1. 结构体内存对齐规则

  对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值

  • vs中的默认值为8;
  • Linux中的默认值为4;
  1. 原则1:数据成员的对齐规则(以最大的类型字节为单位)。
      结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存放在offset为该数据成员大小的整数倍的地方(比如int在32位机为4字节,则要从4的整数倍地址开始存储)

  2. 原则2:结构体作为成员的对齐规则。
      如果一个结构体B里嵌套另一个结构体A,则结构体A应从offset为A内部最大成员的整数倍的地方开始存储。(struct B里存有struct A,A里有char,int,double等成员,那A应该从8的整数倍开始存储。),结构体A中的成员的对齐规则仍满足原则1、原则2。
    **(注意)**结构体A所占的大小为该结构体成员内部最大元素的整数倍,不足补齐;不是直接将结构体A的成员直接移动到结构体B中。

  3. 收尾工作
      结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

示例1:

struct
{
   
	int a;
	short b;
}A;
//sizeof(A) = 8;
struct
{
   
	int a;
	char b;
	short c;
}A;
//sizeof(A) = 8;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值