我会尝试简短地解释一下。
什么是数据对齐?
计算机的体系结构由处理器和内存组成。
记忆是按细胞组织的,因此:
0x00 | data |
0x01 | ... |
0x02 | ... |
每个存储单元都有指定的大小,即它可以存储的位数。这是依赖于架构的。
当您在 C/C++ 程序中定义变量时,or more您的程序占用了不同的单元格。
例如
int variable = 12;
假设每个单元包含 32 位,并且int
类型大小是 32 位,然后在你的内存中的某个地方:
variable: | 0 0 0 c | // c is hexadecimal of 12.
当您的 CPU 必须对该变量进行操作时,它需要将其放入其寄存器中。一个CPU可以接收“1 clock“内存中的少量位,该大小通常称为WORD。这个维度也依赖于架构。
现在假设您有一个变量,由于某些偏移,该变量存储在两个单元格中。
例如,我有两个不同的数据要存储(我将使用“字符串表示形式更清晰"):
data1: "ab"
data2: "cdef"
所以内存将以这种方式组成(2个不同的单元):
|a b c d| |e f 0 0|
那是,data1
只占据细胞的一半,所以data2
占据剩余部分和第二单元的一部分。
现在假设你的CPU想要读取data2
。 CPU需要2 clocks为了访问数据,因为在一个时钟内它读取第一个单元,在另一个时钟内它读取第二个单元中的剩余部分。
If we align data2
根据这个记忆示例,我们可以
介绍一种padding并转变data2
全部在第二个牢房里。
|a b 0 0| |c d e f|
---
padding
这样CPU只会损失“1 clock“为了访问data2
.
对齐系统的作用是什么
刚刚推出的对齐系统padding为了根据架构将数据与系统内存对齐。
我为什么要关心对齐?
我不会深入探讨这个答案。
然而,从广义上讲,内存对齐来自于上下文的要求。
在上面的示例中,使用填充(因此数据是内存对齐的)可以节省 CPU 周期以检索数据。由于内存访问次数较少,这可能会对程序的执行性能产生影响。
然而,除了上面的例子(仅为了解释目的)之外,还有许多其他场景,内存对齐是有用的,甚至是需要的。
例如,某些架构可能对如何访问内存有严格的要求。在这种情况下,填充有助于分配满足平台约束的内存。