首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-11 
大家讨论一下数据对齐(Data Alignment)的底层原因。大家讨论一下数据对齐(Data Alignment),或者叫“字节对齐

大家讨论一下数据对齐(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~~~ 睡觉

[解决办法]
学习了~
[解决办法]


说白了就是“你从一包烟里面一次拿两根烟肯定比分别从两包里面拿一根快!”
[解决办法]

探讨
引用:
哈哈,硬件上的设计导致需要对齐,俺不知,坐2楼来等牛人回答吧。
我只在书上看到过说一个字或双字操作数跨越了4 字节边界,或者一个四字操作数跨越了8 字节边界,被认为是未对齐的,从而需要两次总线周期来访问内存。一个字起始地址是奇数但却没有跨越字边界被认为是对齐的,能够在一个总线周期中被访问。

对啊,就是这个。
为啥跨越了边界,就非得两个周期,而不能做成一个周期。也就是说,硬件设计上的难题到底在哪里。

热点排行