联合体,位域, 结构体对齐
来源:互联网 发布:linux 查看nat表 编辑:程序博客网 时间:2024/06/07 21:08
联合体union
当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的:
1)联合体是一个结构;
2)它的所有成员相对于基地址的偏移量都为0;
3)此结构空间要大到足够容纳最"宽"的成员;
1下面解释这四条描述:
由于联合体中的所有成员是共享一段内存的,因此每个成员的存放首地址相对于于联合体变量的基地址的偏移量为0,即所有成员的首地址都是一样的。为了使得所有成员能够共享一段内存,因此该空间必须足够容纳这些成员中最宽的成员。对于这句“对齐方式要适合其中所有的成员”是指其必须符合所有成员的自身对齐方式。
联合体中保存结构体,对齐按照结构体中最大对齐数对齐
位域
使用位域的主要目的是压缩存储,其大致规则为:
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
从测试上来看, vs2013,是从下一个类型地址长度处开始
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5).结构体总大小为最大对齐数的整数倍。
整体来看,位域的对齐方式和struct还是比较相似的。
结构体
对齐原因
1、平台原因(移植原因):
不是所有的硬件平台都能访问任意地址上的任意数据的;
某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
结构体内存对其规则:
1.第一个成员在与结构体变量偏移量为0的地址处。
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
//对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8
linux中的默认值为4
3.结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数)的整数倍。
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的
整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对
齐数)的整数倍。
其他:
指定对齐值:#pragma pack (value)时的指定对齐值value。
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
0 0
- 联合体,位域, 结构体对齐
- 结构体、联合体和位断的内存对齐问题
- 结构体,联合体的对齐
- 结构体或联合体中的位域
- 结构体struct、枚举enum、联合体union、位字段、自定义类型typedef、字节对齐
- 联合体和结构体字节对齐
- 结构体 联合体 链表 枚举和位域
- 对于结构体,联合体,枚举的总结。内存对齐及结构体大小问题,位段问题。
- 结构体、联合体合体以及位操作
- 位域与结构体对齐
- 结构体对齐, 位域, 柔性数组
- 结构体与位域的对齐
- 带有位域的结构体对齐
- 位域与结构体对齐
- 位域与结构体对齐
- 位域与结构体对齐
- 位域与结构体对齐
- 结构体与位域的对齐:
- 【Unity3d】 导出IOS锁屏闪退
- Python学习笔记
- ThinkPHP5之多语言切换
- 二叉树的前序,中序,后序的递归与非递归遍历
- C++第6次作业
- 联合体,位域, 结构体对齐
- QuantLib教程(一)QuantLib的时间
- Java构造和解析Json数据-fastjson
- 【Caffe学习01】在Caffe中trian MNIST
- R语言入门——常用函数和变量
- 二、SCM 流水灯&FPGA流水灯
- My universe!
- Easy-32
- 转载一个quora上看到的图像处理深度学习论文合集