Memory 与字节可寻址内存相比,从字可寻址内存中提取4字节的字更容易吗?

Memory 与字节可寻址内存相比,从字可寻址内存中提取4字节的字更容易吗?,memory,cpu,cpu-architecture,Memory,Cpu,Cpu Architecture,所以我确实在stackvoerflow中找到了一些与此相关的答案,但没有一个能清楚地回答这个问题 因此,如果我们的内存是字节可寻址的,并且字大小是4字节,那么为什么不让内存字节可寻址呢 如果我没弄错的话,CPU会和文字一起工作,对吗?因此,当cpu试图从内存中获取一个字时,从字节可寻址内存中获取一个4字节字与从字可寻址内存中获取一个字有什么区别?内存通常是字节可寻址的。但是,整词加载是可能的,并且可以在同一时间获得4倍多的数据 如果单词负载是自然对齐的,那么基本上没有区别;地址的低位为零,而不是

所以我确实在stackvoerflow中找到了一些与此相关的答案,但没有一个能清楚地回答这个问题

因此,如果我们的内存是字节可寻址的,并且字大小是4字节,那么为什么不让内存字节可寻址呢

如果我没弄错的话,CPU会和文字一起工作,对吗?因此,当cpu试图从内存中获取一个字时,从字节可寻址内存中获取一个4字节字与从字可寻址内存中获取一个字有什么区别?

内存通常是字节可寻址的。但是,整词加载是可能的,并且可以在同一时间获得4倍多的数据

如果单词负载是自然对齐的,那么基本上没有区别;地址的低位为零,而不是不存在

如果我没弄错的话,CPU会和文字一起工作,对吗

它取决于CPU实现的(ISA)。例如,x86支持大小从单个8位字节到64字节(在最新的CPU中)的操作数。尽管现代x86 CPU中的字大小仅为8或4字节。字大小通常定义为等于通用寄存器的大小。然而,访问内存或寄存器的粒度不一定限于字大小。从程序员的角度和CPU实现的角度来看,这是非常方便的,我将在下面讨论

因此,当cpu试图从内存中获取一个字时,问题是什么 从可寻址字节获取4字节字之间的区别 内存与从单词可寻址内存中获取单词

虽然ISA可能支持字节寻址,但实现ISA的CPU不一定每次从内存中提取一个字节的数据。是一种在大多数实际程序中非常常见的内存访问模式。如果CPU沿着内存层次结构发出单字节请求,那么在处理单字节请求和跨层次结构移动单字节数据时将不必要地消耗大量能量,并严重影响性能。因此,通常,当CPU对某个地址的某个大小的数据发出内存请求时,整个内存块(称为缓存线,通常大小为64字节,对齐为64字节)被带到一级缓存。对同一缓存线的所有请求都可以有效地组合成单个请求。因此,不同级别的内存层次结构之间的地址总线不必包括构成缓存线内偏移的位的连线。在这种情况下,实现将真正以64字节粒度寻址内存

但是,在实现中支持字节寻址可能很有用。例如,如果缓存线只有一个字节发生了更改,并且缓存线必须写回主存,而不是将所有64个字节都发送到内存,那么只发送更改的字节(或几个字节)所需的能量、带宽和时间就会减少。字节可寻址性很有用的另一种情况是,支持关键字优先的思想。这要复杂得多,但为了简单起见,我就到此为止


是当今大多数计算机系统中普遍使用的一类主存接口。数据总线宽度为8字节,协议仅支持传输带字节启用信号(称为数据掩码)的对齐8字节块,以选择要写入的字节。因此,主存储器通常是8字节可寻址的。是CPU提供了字节可寻址的假象。

但是在字节可寻址内存中,4字节字的提取是如何工作的呢?我需要为每个字节访问内存4次吗?考虑到内存是字节可寻址的,每个地址包含1个字节?比如,如果我想在地址0中找到内存的第一个字,我应该取地址0,1,2,3,对吗?因为内存是字节可寻址的,所以每个字必须有4个地址@约翰彭斯:谢谢你澄清了你被挂断的原因。是的,宽负载从多个字节获取数据,每个字节可以用窄负载单独寻址。您可以将其视为多字节传输,但它们在具有至少1个字宽的数据总线的CPU上并行发生。(例如,Haswell中L1D缓存和加载/存储执行单元之间的数据路径为256位宽:32字节,因此即使是AVX SIMD向量加载也是一个操作)@约翰:还要注意,数据在缓存和主存之间以整个缓存线(通常为64字节)的突发方式传输。将地址视为多字节传输的起点。地址的低位是缓存线的偏移量,而高位选择缓存线。关于CPU如何将单个字节存储到DRAM(而不是像普通的那样存储到缓存)是很有趣的。您可能还想在这里阅读我的答案…@John:有关地址位线如何使用实际数据总线在实际CPU中选择内存位置的更多详细信息,请参阅(以及我2017年关于自发布以来发生了哪些变化的评论:)。对于对齐的字加载,要求低地址位为零而不是根本不存在它们并没有太大区别。它只允许额外的功能进行窄加载。顺便说一句,字节加载和字加载的存在是Endianness的一个特点。在你的问题中,“记忆”是什么意思?真正的RAM芯片?(什么样的?)DIMM?CPU向其上运行的代码公开的内存视图?有趣的事实:8088没有高速缓存和8位数据总线(与其他相同的8086上的16位相比),因此它确实一次访问一个字节的所有内存。这是一个16位字大小的CPU的真实例子。但这种设计选择仅仅是为了使构建成本更低(并围绕以下目标构建系统:CPU包上的数据总线引脚更少/主板上的记录道更少)。8086具有16位数据