Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么需要内存对齐?_C++_C_Memory_Pointers_Memory Alignment - Fatal编程技术网

C++ 为什么需要内存对齐?

C++ 为什么需要内存对齐?,c++,c,memory,pointers,memory-alignment,C++,C,Memory,Pointers,Memory Alignment,可能重复: 我在网上读了一些关于内存对齐的文章,并且理解了从正确对齐的内存(采用2字节对齐)我们可以一次快速获取数据 但是,如果我们有像单个硬件一样的内存,那么给定一个地址,为什么我们不能直接从该位置读取2字节呢。比如: 我考虑过了。我认为,如果记忆在奇偶银行,那么这个理论就会适用 我错过了什么 在第一种情况下(单个硬件),如果需要读取2个字节,那么处理器将不得不发出两个读取周期,这是因为内存是字节可寻址的,即每个字节都有一个唯一的地址 将内存组织为内存组有助于CPU在单个读取周期内将更多数

可能重复:

我在网上读了一些关于内存对齐的文章,并且理解了从正确对齐的内存(采用2字节对齐)我们可以一次快速获取数据

但是,如果我们有像单个硬件一样的内存,那么给定一个地址,为什么我们不能直接从该位置读取2字节呢。比如:

我考虑过了。我认为,如果记忆在奇偶银行,那么这个理论就会适用

我错过了什么

在第一种情况下(单个硬件),如果需要读取2个字节,那么处理器将不得不发出两个读取周期,这是因为内存是字节可寻址的,即每个字节都有一个唯一的地址


将内存组织为内存组有助于CPU在单个读取周期内将更多数据提取到寄存器中。这种技术有助于减少读取周期,与CPU的处理能力相比,读取周期非常慢。因此,对于单个读取周期,您可以读取更多的数据。

您的图片描述了我们(人类)如何可视化计算机内存

实际上,把内存想象成巨大的比特矩阵。 每个矩阵列都附有一个“读卡器”,可以读取/写入该列中的任何位。 每个矩阵行都有一个“选择器”,可以选择读卡器将读/写的特定位

因此,该读取器可以一次读取整个选定的矩阵行。 此行的长度(矩阵列的数量)定义了一次可以读取多少数据。 例如,如果您有64列,那么您的内存控制器可以一次读取8个字节(但它通常可以执行更多操作)

只要保持数据对齐,就不需要太多的内存访问。 即使只需要读取两个位,但它们位于不同的行上,也需要两次而不是一次访问内存

还有,写作的整个方面,这是一个不同的问题

就像你可以读整行一样,你也可以写整行。
如果数据未对齐,则在写入非整行内容时,需要执行读-修改-写操作(读取该行的旧内容,修改相关部分并写入新内容)

来自内存的数据通常通过一组与总线宽度匹配的导线传送到处理器。例如,如果总线为32位宽,则有32条数据线从总线进入处理器(以及其他控制信号线)

在处理器内部,各种电线和交换机将这些数据传送到任何需要的地方。如果将32个对齐位读入寄存器,则导线可以非常直接地将数据传送到寄存器(或其他保持位置)

如果将8或16个对齐位读入寄存器,则导线可以以相同的方式传送数据,寄存器中的其他位设置为零

如果将8或16个未对齐的位读入寄存器,则导线无法直接传输数据。相反,这些位必须移位:它们必须经过一组不同的导线,以便可以“移动”它们,与进入寄存器的导线对齐


在一些处理器中,设计者已经添加了额外的电线和开关来进行移动。就硅的用量而言,这可能非常昂贵。为了能够将任何可能的未对齐字节移动到所需位置,您需要大量额外的导线和开关。因为这是如此昂贵,在一些处理器中,没有一个完整的移位器可以立即执行所有移位。相反,移位器可能只能在每个CPU周期内移动一个字节左右的位,并且需要几个周期才能移动几个字节。在某些处理器中,根本没有连接线,因此所有加载和存储都必须对齐。

只是硬件将数据存储在1、2、4块中。。字节(取决于硬件)。所以,如果你想从不同的块中得到两个字节,你必须做两个操作,而一些硬件会干脆拒绝在两个周期内进行访问。这是不可能复制的。我之前读过这篇文章,并从答案中找到了链接www.ibm.com/developerworks/library/pa-dalign/。我发现他们把所有的图表都像一个大内存一样显示出来,我当时考虑了这个问题。我得到的答案都已经写在我的问题里了。我只想验证一下。是的,所以“内存对齐是好的”这个概念在单内存h/w中没有意义???我相信,每个字节,无论是在银行内存还是单内存中,都会得到唯一的地址?是的。。每个字节都有一个唯一的地址。。你可以参考这篇文章,你的“读者”抛物线是非常清楚的!谢谢