免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: fufeiwxy
打印 上一主题 下一主题

关于“对齐” [复制链接]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
11 [报告]
发表于 2006-10-10 13:29 |只看该作者
原帖由 fufeiwxy 于 2006-10-10 11:18 发表
5楼的是什么意思?能不能详细说一下!谢谢了阿

有的体系结构是不可以从奇数边界开始访问一个超过1字节的整型。
比方如下代码:

  1. char s[10];
  2. *((int*)(s+1)) = 1;
复制代码

可能上面有些代码在有些体系结构里根本无法执行

论坛徽章:
0
12 [报告]
发表于 2006-10-10 14:19 |只看该作者
感谢上面的XD,关于“对齐”,我把我的理解总结如下,希望各位XDJM批评指正:
1 首先是这个编译器。
编译器对于平台有很强的依赖性,因此,不同的平台,编译器默认的对齐是不同的:当今大多数对齐是4,比较老的机器上的编译器可能会是2,而对于64位机,则是8。主要取决于cpu的设计。

2 cpu的内存访问颗粒度是不变的,而这个颗粒度的大小,就是编译器默认的对齐。

3 为什么对于同一台机器,不同的变量对齐却是不同的呢?主要是一个折中(tradeoff)的问题。
假设所有变量的对齐都是4,那么,当访问一个char变量时,编译器也要使该变量的地址按照4对齐,为了圆整,又要有三个字节的填充,这样做很明显内存的浪费是严重的。
不同变量的对齐不同所带来的后果是:cpu在访问一个变量的时候,仍然一次读取4个字节,然后做相应的移位操作,找到所需要的地址。很明显,效率降低了。

4 对于double的8字节对齐,在32位机上,是由两次内存访问完成的。

5 使用#pragma pack(n)改变编译器的默认值的目的,是为了节约内存,但这样做的代价就是效率的降低。

6 凡是地址不是以4对齐的变量(在编译器默认对齐为4的机器上),比如:short n; char c; 以及使用#pragma pack(1),从cpu的角度看,都是不对齐的变量(unaligned address),对于有的cpu,它会采取相应的处理,能够正确访问;但对于有的cpu(lazy processor),它会抛出一个异常,而对这个异常的处理,则是os的事情。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP