关于结构体对齐规则的理解,零基础入门理解

        在学习结构体对齐规则的时候,看过网上整理的资料,并且结合自己的实验测试,发现我对网上的对齐规则是真的不能理解,当我认为我理解的时候,最后还是发现我的理解总是和实验结果相互违背。

无奈之下,只能自己做实验,终于得到了对齐规则的真谛,也完全理解了网上的对齐规则到底讲的是什么。下面是对对齐规则的理解解析:

1、结构体的第一个成员变量的地址,放在相对结构体地址为0的,这个很好理解。

2、指定对齐值,32位系统默认4,字节,64位8字节,可以通过 宏定义#pragma pack(N)来指定对齐值,因为对齐的时候总是取自身字节数和指定对齐值中的偏小的那个值,所以实际上指定对齐值就是对齐值的最大值,可以通过指定对齐值来限制最大对齐值。我们都知道64位系统,编译器默认连long long都只能是8个字节,所以默认情况下我们根本不需要考虑指定对齐值的影响

3、自身对齐值:默认情况下就是该成员变量的字节数

4、存放成员变量时是有序的!按照定义的顺序依次存放。

5、存放的地址,按照自身对齐量的倍数存放,从0倍(也就是相对0地址)开始,如果该位置已经被占用,则倍数加1(也就是加上自身字节数),直到找到空位为止。

比如

struct experiment
{
	char a; //0
	int b; //4 5 6 7
	double c; //8 9 a b c d e f
	char d; //10
	int e; //14 15 16 17
};
experiment ex;
printf(" address a: %p\n address b :%p\n address c:%p\n address d:%p\n address e:%p\n ", &ex.a,&ex.b,&ex.c,&ex.d, &ex.e);
cout << sizeof(ex) << endl;

这里a是char类型首先找到0占用0,b先找0发现被占用,在+4,找到4发现没有被占用,就存了4 5 6 7,同理double c先找0,再找8,温馨提示:分配地址时不能见缝插针!下一个成员变量一定只能放上一个成员变量之后,所以及时地址1 2 3都为空 char d也不能放进去,而是放在double c之后的10位置(这里10是十六进制),int e的存放也是同理

6、总体对齐:这个东西是用来描述计算整个结构体所占字节数的,总体对齐值等于成员变量中的最大字节数。比如上面总体对齐值(最大成员变量字节数)就是8字节,结构体所占的字节数就是最大成员变量字节数的最小倍数,比如上面的例子中,成员变量最后一共占用了18个字节,那么最小能够装下这些成员变量的倍数就是3*8=24,所以该结构体大小24字节。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值