【发布时间】:2019-12-15 14:43:13
【问题描述】:
我了解数据对齐的一般概念,但我不明白的是对内存地址值的限制,强制为底层数据类型大小的倍数。
This answer很好地解释了数据对齐。
引用:
让我们看一个内存映射:
+----+ |0000| |0001| +----+ |0002| |0003| +----+ |0004| |0005| +----+ | .. |在每个地址都有一个可以单独访问的字节。但是只能在偶数地址处获取单词。因此,如果我们读取 0000 处的字,我们会读取 0000 和 0001 处的字节。但如果我们要读取位置 0001 处的字,则需要两次读取访问。首先是 0000,0001,然后是 0002,0003,我们只保留 0001,0002。
问题:
假设它是真的,为什么 " 但是单词只能在偶数地址获取。" 是真的吗?例子中的内存/堆栈指针不能指向0001,然后从那里读取一个信息字吗?
我们知道机器可以通过一次读取操作以 2 个字节的块读取内存(在示例中为 [0000, 0001] 或 [0002, 0003])。因此,如果我的地址寄存器指向 0001(奇数地址而不是偶数地址),那么我可以在一次读取操作中直接从那里读取 2 个字节(即 0001 和 0002),对吗?
【问题讨论】:
-
Purpose of memory alignment 及其答案有帮助吗?
-
@user4581301 我确实看过这个。它确实概述了问题,但没有解决内存地址多重性限制。谢谢
-
想想第一个答案关于速度的部分所涉及的性能问题:如果数据没有对齐,可能需要多次读取。如果硬件排队读取 16 位块,对于未对齐的数据,CPU 可能必须读取 16 位,保留高 8 位,读取 16 位,保留低 8 位,组装并放入寄存器。这很糟糕。许多 CPU 通过拒绝这个问题将它扼杀在萌芽状态。那些允许它接受性能打击的人
-
@user4581301 是的,我明白你想说什么。链接的答案说类似。但是,我的问题是关于不同的问题;地址本身的问题,而不是指向的数据,是数据大小的倍数。如果不是这种情况,我可以简单地移动地址并在一次读取中提取保存我的适当大小数据的内存块。 (正如我在问题的后半部分所说的)
-
@User10482 我不明白您在找到和获得的答案与您提出的问题之间有何区别,您似乎认为它们不同,但事实并非如此。
标签: c++ system compiler-optimization