c++ - 数据对齐 : Reason for restriction on memory address being multiple of data type size

标签 c++ system compiler-optimization

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

This answer很好地解释了数据对齐。

引用:

Let's look at a memory map:

+----+
|0000| 
|0001|
+----+
|0002|
|0003|
+----+
|0004|
|0005|
+----+
| .. |

At each address there is a byte which can be accessed individually. But words can only be fetched at even addresses. So if we read a word at 0000, we read the bytes at 0000 and 0001. But if we want to read the word at position 0001, we need two read accesses. First 0000,0001 and then 0002,0003 and we only keep 0001,0002.

问题:

假设是真的,为什么“但是只能在偶数地址取词。”是真的吗?内存/堆栈指针不能指向示例中的 0001,然后从那里开始读取一个字的信息吗?

我们知道机器可以通过一次读取操作以 2 字节为单位读取内存(在示例 [0000, 0001] 或 [0002, 0003] 中)。因此,如果我的地址寄存器指向 0001(奇地址而不是偶地址),那么我可以在一次读取操作中直接从那里读取 2 个字节(即 0001 和 0002),对吗?

最佳答案

关于该陈述的假设不一定正确。我不想重复您链接到描述使用和高度偏好对齐访问的原因的答案,但有些架构确实支持未对齐的内存访问——例如 ARM(查看此 SO answer)。

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


某些 Cortex-M 内核明确允许您通过配置使用错误寄存器使 CPU 在对齐访问时触发异常,这意味着您可以在罕见的用例中“利用”未对齐的内存访问。

关于c++ - 数据对齐 : Reason for restriction on memory address being multiple of data type size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57403252/

相关文章:

c++ - C++ 中的图/边类构造函数

c++ - 类设计以避免需要基类列表

c++ - 为什么这个函数的递归版本更快?

C++ 自动注释 block 工具

c++ - gdb : what is a symbol-file used for debugging

file - 重命名目录和部分文件重命名

c# - 从 USB 运行 Visual Studio 2012 Express c#

android - init.rc 中的 mkdir

c++ - 什么在 cpu 成本方面更好?在运行时移位或将所有可能的值存储在数组中?

c++ - 优化析构函数的大小