数据对齐:限制内存地址为数据类型大小的倍数的原因

2024-02-17

我理解数据对齐的一般概念,但我不理解的是对内存地址值的限制,强制为基础数据类型大小的倍数。

这个答案 https://stackoverflow.com/a/672482/11205473很好地解释了数据对齐。

Quote:

我们看一下内存映射:

+----+
|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),对吧?


关于该陈述的假设不一定正确。我不想重复您链接到的答案,该答案描述了使用和高度首选对齐访问的原因,但有些架构确实支持未对齐内存访问 - 例如 ARM(请查看此所以答案 https://stackoverflow.com/a/32095106/5280925).

但我认为,你的问题实际上归结为硬件架构,特别是数据总线设计,以及各个芯片制造商的工程师设计的随附指令集。


某些 Cortex-M 内核明确允许您启用 CPU 来触发异常un-通过配置使用错误寄存器来对齐访问,这意味着您can在极少数用例中“利用”未对齐的内存访问。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据对齐:限制内存地址为数据类型大小的倍数的原因 的相关文章

随机推荐