数据线与内存访问粒度的区别!!高手进!
cpu与内存之间访问数据的大小是根据数据总线的宽度来决定的,现代的计算机数据总线的宽度是32位,也就是每次都能够从内存中读取32位的数据(即四个字节),但是为什么又出现了一个“内存访问粒度”这样一个概念呢???内存对齐指的是cpu访问内存中的数据在地址上有限制,那么指定字节对齐值对cpu访问数据的大小是不是同样也起作用呢????
回复 3楼 玩出来的代码
你给的这篇帖子我看了,可是依然没有解决我的问题,可能是本人比较愚笨吧!!cpu访问内存中的数据是通过数据总线来访问的,也就是cpu每次取数据应该是32位的,因为数据总线的宽度是32位,所以每次取的数据应该是四个字节。如果是这样的话那么内存访问粒度又有什么用呢???难道我可以改变内存访问粒度吗???我在网上也找了一点资料,其中有个人自己总结了几点:1 cpu的内存访问颗粒度是不变的,而这个颗粒度的大小,就是编
译器默认的对齐。
2 为什么对于同一台机器,不同的变量对齐却是不同的呢?主要是
一个折中(tradeoff)的问题。
假设所有变量的对齐都是4,那么,当访问一个char变量时,编译器
也要使该变量的地址按照4对齐,为了圆整,又要有三个字节的填充,
这样做很明显内存的浪费是严重的。不同变量的对齐不同所带来的后
果是:cpu在访问一个变量的时候,
仍然一次读取4个字节,然后做相应的移位操作,找到所需要的地址。
很明显,效率降低了。
3 对于double的8字节对齐,在32位机上,是由两次内存访问完成的。
4 使用#pragma pack(n)改变编译器的默认值的目的,是为了节约内存,
但这样做的代价就是效率的降低。
5 凡是地址不是以4对齐的变量(在编译器默认对齐为4的机器上),比
如short n; char c; 以及使用#pragma pack(1),从cpu的角度看,都
是不对齐的变量(unaligned address),对于有的cpu,它会采取相应
的处理,能够正确访问;但对于有的cpu(lazy processor),它会抛出一
个异常,而对这个异常的处理,则是os的事情。
而在你给出的这篇帖子中却有这样的的描述:同样如果'内存访问粒度'为1,CPU从地址1开始读取,也需要4次访问才能将4个字节读到寄存器中;而且对于这种理想中的''内存访问粒度'为1的CPU,所有地址都是'aligned address'........
如果按照这种说法的话那岂不是内存访问粒度改变了呀???可是为什么一个人说改变而另一个人说不改变???难道不让人糊涂吗???
因此众说纷纭谁对谁又错呢??