字节对齐
2015-12-24 18:47
169 查看
1. 对齐的作用和原因
各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐。其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。显然在读取效率上下降很多
例,一个int的地址是0x03的话,先是按地址0x00取int的第一个byte,然后按地址0x04取剩下的三个byte
2. 编译器是按照什么样的原则进行对齐的
数据类型自身的对齐
对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节
结构体或者类的自身对齐值
其成员中自身对齐值最大的那个值
指定对齐值
pragma pack (value)时的指定对齐值value
3. 自然对齐
对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的
各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐。其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。显然在读取效率上下降很多
例,一个int的地址是0x03的话,先是按地址0x00取int的第一个byte,然后按地址0x04取剩下的三个byte
2. 编译器是按照什么样的原则进行对齐的
数据类型自身的对齐
对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节
结构体或者类的自身对齐值
其成员中自身对齐值最大的那个值
指定对齐值
pragma pack (value)时的指定对齐值value
3. 自然对齐
对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的
相关文章推荐
- 蓝桥杯VIP题库之第二期——分解质因数
- linux下IPTABLES配置详解
- C语言开发总结(二十七)
- CUnit的用法
- [本机配置迁移] 生产过程,非开发(1)
- 被android 6.0坑了,原文章写的挺好的,我就直接上链接了
- [Polymer] Custom Elements: Styling
- 深刻理解Docker镜像大小
- 伪静态--urlrewrite
- 移动开发js库Zepto.js使用中的一些注意点
- Cloudera Manager 5 和 CDH5 本地(离线)安装指南
- vba中中文数字和阿拉伯数字转换,也说下sub求面积的问题
- IE6不支持min-height的解决办法
- ViewDragHelper 的学习一
- MPAndroidChart 教程:动态和实时数据 Dynamic & Realtime Data(八)
- iOS笔记UI--生成二维码Demo(不是扫码,是根据字符串生成二维码)
- Jave 从 httpRequest 中获取 ip 地址
- Android文件操作
- angularjs中指令的scope
- OpenGL ES 3.2