关于 内存对齐 && 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。
- 关于 内存对齐 && sizeof 的介绍 1——联合体
- 关于 内存对齐 && sizeof 的介绍 1——联合体
- 关于 内存对齐 && sizeof 的介绍 2 —— 结构体
- 关于 内存对齐 && sizeof 的介绍 2 —— 结构体(改)
- sizeof 关于内存对齐的理解
- 关于sizeof中的内存对齐
- 转:struct 关于sizeof的大小-内存对齐问题
- 关于结构体,内存对齐,sizeof
- 内存对齐 & 联合体(共用体)
- 结构体和联合体的内存对齐问题
- 结构体、联合体和位断的内存对齐问题
- C++ sizeof 及 涉及的内存对齐
- 与内存对齐有关的sizeof
- sizeof运算符的内存对齐问题
- sizeof()等等的内存对齐问题
- struct结构体和union联合体:字节对齐下的sizeof返回
- 神秘的 sizeof(union) 、sizeof(struct) 和内存对齐技术
- 神秘的 sizeof(union) 、sizeof(struct) 和内存对齐技术
- Subsets II
- ERROR 1010 (HY000): Error dropping database (can't rmdir './xyz', errno: 39)
- C++基础题目积累
- linux学习之磁盘文件
- 关于反码、补码、原码的一些应用于理解
- 关于 内存对齐 && sizeof 的介绍 1——联合体
- Java程序的运行
- C语言基础:结构体
- Codeforces 549E Sasha Circle
- fsdfsdfsdf
- 单例模式:单例类的标准写法 - iOS - UI基础知识总结13
- 赚大钱才能爱一场。
- C语言基础:函数(Function)
- 大话数据结构—散列表查找(哈希表)