C++:struct和union 内存字节对齐问题
来源:互联网 发布:广州网站搜索优化 编辑:程序博客网 时间:2024/05/23 00:02
struct内存对齐问题
1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。
2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)
3:结构体总大小:也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.
例1.
typedef struct AA{ int aa1; //[0]....[3] double aa2; //[8].....[15] float aa3; //[16]..[19] 原则3:结构体总大小,总长要为8的整数倍,补齐[20]...[23]};typedef struct BB{ char bb1[2]; //[0],[1] int bb2; //[4]...[7] double bb3; //[8]....[15] short bb4; //[16],[17] AA a; //[24]......[47] 原则2,内部对象为结构体 };
结果
24 48
union内存字节对齐
其实union(共用体)的各个成员是以同一个地址开始存放的,每一个时刻只可以存储一个成员,这样就要求它在分配内存单元时候要满足两点:
1.一般而言,共用体类型实际占用存储空间为其最长的成员所占的存储空间;
2.若是该最长的存储空间对其他成员的元类型(如果是数组,取其类型的数据长度,例int a[5]为4)不满足整除关系,该最大空间自动延伸;
我们来看看这段代码:
union mm{ char a; //元长 度1 int b[5];//元长度4 double c;//元长度8 int d[3]; };
本来mm的空间应该是sizeof(int)*5=20;但是如果只是20个单元的话,那可以存几个double型(8位)呢?两个半?当然不可以,所以mm的空间延伸为既要大于20,又要满足其他成员所需空间的整数倍,即24
所以union的存储空间先看它的成员中哪个占的空间最大,拿他与其他成员的元长度比较,如果可以整除
2 0
- C++:struct和union 内存字节对齐问题
- 对《C语言:内存字节对齐详解——struct 和 union 》的理解
- 关于struct和union存储的内存字节对齐的问题
- struct与union字节对齐问题
- 字节对齐(struct 和 union)
- C/C++ struct/class/union内存对齐
- C/C++ struct/class/union内存对齐
- C/C++ struct/class/union内存对齐
- struct union 内存对齐
- union struct 内存对齐
- struct/union内存对齐
- union和struct对齐大小问题
- C语言的struct/union字节对齐详解
- C语言的struct/union字节对齐详解
- struct和 union用 sizeof 看字节对齐
- C struct 中字节对齐问题
- C struct 中字节对齐问题
- C struct 中字节对齐问题
- ural 1820. Ural Steaks -思维题
- 移动端自适应布局----rem字体
- 静态库和共享库
- Map集合
- 欢迎使用CSDN-markdown编辑器
- C++:struct和union 内存字节对齐问题
- 利用oracle中的序列巧解并发流水号问题
- Spark算子:RDD行动Action操作(4)–countByKey、foreach、foreachPartition、sortBy
- 基本 数据库DB
- vmware虚拟机磁盘扩容全纪录
- 时间和空间复杂度
- HDU2043_密码
- PB 随笔1
- 数据库使用