关于 内存对齐 && sizeof 的介绍 1——联合体

1:联合对齐:

 

首先解释一下什么叫做联合体:

1:联合体的各个成员都是从同一个地址开始存放,每次只可以存放一个成员。即:它的所有成员相对于基地址的偏移量都为0。

2:此结构空间要大到足够容纳最“宽”的成员。

3:其对齐方式要适合于联合中所有类型的成员。

 

其次我们来了解一下 计算联合体的内存分配大小的方法:

1:先找出联合体中最“宽”,即占空间最大的成员,计算其分配的空间大小LEN。

     注:若成员为数组的话,则取数组的整体长度,而不是单个数据元素的长度。如:int a[5] ,则该成员取长度为20。)

2:计算出其他的各成员对齐长度(注:这里的成员要是数组的话,则取数组的单个元素的对齐长度)的最小公倍数NUM。

2:再将得到LEN与NUM进行比较,看能否整除。

3:若能整除,则对该联合体进行sizeof的话,长度就为LEN。

4:若不能整除,则将LEN自动延长最近的且可以整除NUM的大小。

 

举例如下(论坛常见的例子):

union DATE
{
    char a;
    int i[5];
    double b;
};

DATE max;

cout<< sizeof(max) << endl;// 24


该联合体的sizeof 得到 24的过程如下:

1:该结构要放得下int i[5]必须要至少占4×5=20个字节。(为了容纳“最宽”的成员), 即LEN==20。

2:再来讨论他的内存对齐方式以及sizeof的大小:

     假若没有double的话,我们已经知道 char 按1个字节对齐, int 按4个字节对齐,故而取1和4的最小公倍数为4(NUM==4),20可以整除4,所以就按照4字节对齐。

     但是加入了double就必须考虑double的对齐方式,double是按照8字节对齐的(NUM==8),。20不可以整除8,所以必须添加4个字节使其满足8×3=24。

     所以,对该联合体进行sizeof的话,就为24。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值