假设我的结构A
是POD,void
指针是p
。
我可以安全地将p
转换为指向A
的指针,然后读取/写入A
指向的p
结构吗?
即使A
的对齐为8而p指向奇数内存地址,它是否保证每次都有效? (最坏的情况)
我并不担心性能问题,我只是想知道它是否应该按照标准运行和/或是否在主流平台上足够便携。
编辑:我也有兴趣知道是否有任何差异取决于x86 / 64位架构
谢谢!
答案 0 :(得分:3)
是的,您可以将指向A类的指针强制转换为B类。
基本上,在引用class B
变量的内存位置时,您告诉编译器使用模板class A
。
通常,这是不安全的,因为这些位置的值将具有不同的含义和位置。
通常,这种类型的转换用于将uint8_t
的缓冲区解释为结构化对象。另一种用法是有union
时。
因此术语 safe 取决于使用该操作的上下文。
编辑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"中按首选顺序获取位。这些操作也会对性能产生负面影响。