MyException - 我的异常网
当前位置:我的异常网» C++ » 大家讨论一下数据对齐(Data Alignment)的底层原因

大家讨论一下数据对齐(Data Alignment)的底层原因。解决方案

www.MyException.Cn  网友分享于:2013-03-12  浏览:32次
大家讨论一下数据对齐(Data Alignment)的底层原因。
大家讨论一下数据对齐(Data Alignment),或者叫“字节对齐”的底层原因。
即到底是哪些硬件设计上的具体原因导致了数据需要对齐,否则便会低效甚至错误。

------解决方案--------------------
http://www.cnblogs.com/tujunyan/archive/2009/05/23/1487934.html
------解决方案--------------------
哈哈,硬件上的设计导致需要对齐,俺不知,坐2楼来等牛人回答吧。
我只在书上看到过说一个字或双字操作数跨越了4 字节边界,或者一个四字操作数跨越了8 字节边界,被认为是未对齐的,从而需要两次总线周期来访问内存。一个字起始地址是奇数但却没有跨越字边界被认为是对齐的,能够在一个总线周期中被访问。
------解决方案--------------------
http://www.ibm.com/developerworks/library/pa-dalign/

原因就是
chunk 是读取的单位。
------解决方案--------------------
小朋友的问题,关注一下


------解决方案--------------------
4B是因为以前系统都是32位数据线,所以就顺便一起给取了出来咯~~~
------解决方案--------------------
可能因为寻址的问题吧,指针地址偶数比奇数快。
具体希望哪位能说一下
------解决方案--------------------
先顶再说。。。
------解决方案--------------------
探讨
http://www.ibm.com/developerworks/library/pa-dalign/

原因就是
chunk 是读取的单位。

------解决方案--------------------
为了优化性能,简化设计,内存的访问一般是以内存总线的宽度为单位的.而非以字节为单位.这就直接导致如果访问了跨越边界的数据会花更多的周期. 因为内存本身根本就没有提供访问到所有具体字节的能力. x86上,我们之所以能访问跨界数据及非对齐的数据,是CPU做了折中的处理,以性能为代价换来了功能.
在有些平台上为了硬件设计的简单,根本就不提供访问跨越边界的数据的能力,比如ARM9.

与此相像的还有硬盘的访问, 硬盘是以扇区为最小单位的.还有闪存也是以区块为最小单位进行访问的.
------解决方案--------------------
mark
------解决方案--------------------
1> 到底是哪些硬件设计上的具体原因导致了数据需要对齐
2> 为啥跨越了边界,就非得两个周期,而不能做成一个周期。也就是说,硬件设计上的难题到底在哪里。

恩,这两个是真正窥探到问题的核心。之后涉及到上面提到的内存的奇偶地址、总线周期及宽度、内存对齐等,深入了解这些,就像初步了解了最最最雏形的CPU,也就是怎么设计CPU。

我是这样来想的:
由数据从存放到取这个过程来想:
我们假设思考的CPU要按照数据的高位部分在高地址,低位部分在低地址,这就是所谓的小端。然后读就是从
地址0开始读,我们在这里把0当成偶数。(p.s:我想C/C++数组下标为什么从0开始也是有这个原因的,听说
数组下标从0开始还是从1开始,也曾经出现过“大战”)

>>1 “破解”奇偶地址,也就是为什么从奇地址访问会带来两个周期的开销?
我们用最简单的8086来看,数据的读取和指令的执行总是从映射的开始位置(0)处执行,事实上也确实是这样。
|0|
|1| <===> 内存“编号”
|2|
|3|
首先要知道 8086是16位微处理器,其外部数据总线为16位,每个存储周期可以访问存储器中的8位或16位信息。
我们按16位来访问,对于一个16位数的变量来说:
如果从内存“0”处存,那么占据的位置就是“0”和“1”,所以8086将用一个总线周期访问该变量。
而如果从内存“1”处存放,那么占据的位置就是“1”和“2”, 则要先读“0和1”的单元,再读“2
和3”的单元,这就需要两个周期了。

访问内存的这个过程也叫做打包和解包。
C/C++ code
//下面这个简单的代码只是对高位部分在高地址,低位部分在低地址,这就是所谓的小端进行验证
int main()
{
    unsigned short sn = 0x1234;
    char *p = (char *)&sn;
    printf("%p %x, %p %x\n", p, *p, p+1, *(p+1));
    return 0;
}

------解决方案--------------------
2> 内存对齐。内存对齐的大致作用就是以空间换取时间(即效率)。如7L说的那样“与此相像的还有
硬盘的访问, 硬盘是以扇区为最小单位的.还有闪存也是以区块为最小 单位进行访问的。”
C/C++ code
struct tag      
{                
    char ch;         
    int n;         
}   
struct tag 
{ 
    int n; 
    char ch;
}

------解决方案--------------------
学习,睡觉。
------解决方案--------------------
探讨
综上所述,从大抵来看,回答了为啥对齐比较快以及对于18L所问的 。。。

。。。。呵呵 老大见笑了,各位见笑了。

Faint~~~ 睡觉

------解决方案--------------------
学习了~
------解决方案--------------------

文章评论

我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
代码女神横空出世
代码女神横空出世
中美印日四国程序员比较
中美印日四国程序员比较
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序员必看的十大电影
程序员必看的十大电影
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
旅行,写作,编程
旅行,写作,编程
每天工作4小时的程序员
每天工作4小时的程序员
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员的鄙视链
程序员的鄙视链
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
Java程序员必看电影
Java程序员必看电影
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
编程语言是女人
编程语言是女人
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
总结2014中国互联网十大段子
总结2014中国互联网十大段子
那些争议最大的编程观点
那些争议最大的编程观点
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
一个程序员的时间管理
一个程序员的时间管理
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
如何成为一名黑客
如何成为一名黑客
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
我是如何打败拖延症的
我是如何打败拖延症的
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员都该阅读的书
程序员都该阅读的书
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
为什么程序员都是夜猫子
为什么程序员都是夜猫子
漫画:程序员的工作
漫画:程序员的工作
鲜为人知的编程真相
鲜为人知的编程真相
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
 程序员的样子
程序员的样子
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有