假设我有一个 A
类型的结构,它是 POD,还有一个 void
指针 p
。
我能否安全地将 p
转换为指向 A
的指针,然后读取/写入 p< 指向的
?
它是否保证每次都能工作,即使 A
结构A
的对齐方式是 8 并且 p 指向奇数内存地址? (最坏的情况)
我不关心性能问题,我只是想知道它是否应该按照标准工作和/或它在主流平台上是否足够便携。
编辑:我也很想知道 x86/64 位架构是否有任何差异
谢谢!
最佳答案
是的,您可以将指向 A 类的指针转换为 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 位。
处理器还必须执行一些操作以在一个“字”中以首选顺序获取位。这些操作也会对性能产生负面影响。
关于c++ - 未对齐读/写的可移植性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28996867/