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

来源:互联网 发布:mac 搜狗不能使用 编辑:程序博客网 时间:2024/06/13 17:21

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。

0 0