未对齐读/写的可移植性如何?
how portable are unaligned read / write?
假设我有一个 A
类型的结构,即 POD,还有一个 void
指针 p
.
我可以安全地将 p
转换为指向 A
的指针,然后将 read/write 转换为 p
指向的 A
结构吗?
它是否保证每次都能工作,即使 A
的对齐方式是 8 并且 p 指向奇数内存地址? (最坏的情况)
我不关心性能问题,我只是想知道它是否应该按照标准工作和/或它在主流平台上是否足够便携。
编辑:我也很想知道 x86 / 64 位架构是否有任何差异
谢谢!
是的,您可以将指向 class A 的指针转换为 class B。
本质上,您是在告诉编译器在引用 class A
变量的内存位置时使用模板 class B
。
一般来说,这是不安全的,因为位置上的值会有不同的含义和位置。
通常,这种类型的转换用于将 uint8_t
的缓冲区解释为结构化对象。另一种用法是当有 union
时。
所以术语安全取决于使用该操作的上下文。
编辑 1:对齐
大多数现代处理器都可以处理对齐问题。处理器可能需要更多操作来获取数据,这会降低性能。
例如,对于 16 位处理器,在奇数地址上对齐的 16 位值将需要两次提取(因为它仅在事件地址处提取):
+----------+----------------------------+
| address | value |
+----------+----------------------------+
| 16 | N/A |
+----------+----------------------------+
| 17 | 1st 8 bits of 16-bit value |
+----------+----------------------------+
| 18 | 2nd 8 bits of 16-bit value |
+----------+----------------------------+
| 19 | N/A |
+----------+----------------------------+
由于处理器只取偶数地址的值,取值需要 2 次取值。地址 16 处的第一次提取获得 16 位变量的前 8 位。第二次获取获取变量的第二个 8 位。
处理器还必须执行一些操作以在一个 "word" 中以首选顺序获取位。这些操作也会对性能产生负面影响。
假设我有一个 A
类型的结构,即 POD,还有一个 void
指针 p
.
我可以安全地将 p
转换为指向 A
的指针,然后将 read/write 转换为 p
指向的 A
结构吗?
它是否保证每次都能工作,即使 A
的对齐方式是 8 并且 p 指向奇数内存地址? (最坏的情况)
我不关心性能问题,我只是想知道它是否应该按照标准工作和/或它在主流平台上是否足够便携。
编辑:我也很想知道 x86 / 64 位架构是否有任何差异
谢谢!
是的,您可以将指向 class A 的指针转换为 class B。
本质上,您是在告诉编译器在引用 class A
变量的内存位置时使用模板 class B
。
一般来说,这是不安全的,因为位置上的值会有不同的含义和位置。
通常,这种类型的转换用于将 uint8_t
的缓冲区解释为结构化对象。另一种用法是当有 union
时。
所以术语安全取决于使用该操作的上下文。
编辑 1:对齐
大多数现代处理器都可以处理对齐问题。处理器可能需要更多操作来获取数据,这会降低性能。
例如,对于 16 位处理器,在奇数地址上对齐的 16 位值将需要两次提取(因为它仅在事件地址处提取):
+----------+----------------------------+
| address | value |
+----------+----------------------------+
| 16 | N/A |
+----------+----------------------------+
| 17 | 1st 8 bits of 16-bit value |
+----------+----------------------------+
| 18 | 2nd 8 bits of 16-bit value |
+----------+----------------------------+
| 19 | N/A |
+----------+----------------------------+
由于处理器只取偶数地址的值,取值需要 2 次取值。地址 16 处的第一次提取获得 16 位变量的前 8 位。第二次获取获取变量的第二个 8 位。
处理器还必须执行一些操作以在一个 "word" 中以首选顺序获取位。这些操作也会对性能产生负面影响。