x86中的高效内存访问?

x86中的高效内存访问?,x86,X86,我在某个地方读到,当在汇编中的32位x86处理器上编程时,以4字节的倍数写入和读取内存会更高效,尽管事实上可以以低至1字节的单位工作。这是真的吗?为什么是真的?到底是什么样的底层设计导致它这样工作?唯一真正的性能损失是从非对齐位置读取多字节值。其他一切都很重要,特别是考虑到第二个和后续对齐字节可能会被缓存命中。如果需要访问所有4个字节,并且地址是4个字节对齐的,那么它可能会快4倍,因为最近32位CPU上的所有数据路径都至少有32位宽。之所以存在对齐约束,是因为底层内存和高速缓存硬件每次访问内存的

我在某个地方读到,当在汇编中的32位x86处理器上编程时,以4字节的倍数写入和读取内存会更高效,尽管事实上可以以低至1字节的单位工作。这是真的吗?为什么是真的?到底是什么样的底层设计导致它这样工作?

唯一真正的性能损失是从非对齐位置读取多字节值。其他一切都很重要,特别是考虑到第二个和后续对齐字节可能会被缓存命中。

如果需要访问所有4个字节,并且地址是4个字节对齐的,那么它可能会快4倍,因为最近32位CPU上的所有数据路径都至少有32位宽。之所以存在对齐约束,是因为底层内存和高速缓存硬件每次访问内存的块大于1字节,因此,如果要求使用未对齐的DWORD,硬件必须读取2个相邻的DWORD,并使用移位组合所需的DWORD。(虽然我也听说,在最新的CPU上,未对齐内存访问的惩罚较低。)这可能是一种过于简单的说法,但这是一般的要点:如果可能,将所有内存访问对齐到最大可行的2次方,并使用可用的最大元素大小。不同的CPU和主板可能在处理非对齐读写的具体方式上存在很大差异;e、 g.高端MBs很可能可以检测到RAM的非对齐访问序列,并智能地将其转换为两端的一对非对齐访问和中间的一系列对齐访问。稍微离题的问题是,如果我想访问一个字节,数据总线是否会返回4个字节而忽略不需要的3个字节,我不知道这个问题的答案,但我想,如果访问一个字节的话,它只会读取缓存中的那个字节。如果它不在缓存中,那么它几乎肯定会将整个缓存线(通常是32或64字节)从RAM读入缓存中?每个字节的时间或每次读取的时间(可能有多少字节)?