未对齐读/写的可移植性如何?

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" 中以首选顺序获取位。这些操作也会对性能产生负面影响。