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

标签 c++ memory struct

假设我有一个 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/

相关文章:

c++ - 确定值是否在 0=360 度问题的范围内

c++ - 具有 Long 和指针的结构的默认构造函数

c++ - 在类中定义数组但大小在构造函数中确定

java - 如何通过套接字将带有 Unicode 字符的 Java 字符串发送到 C++,而没有奇怪的字符?

c++ - 从 C++ 设置变量时 QML 内存泄漏

c++ - 重新分配(): invalid old size even when malloc() is used to allocate memory

android - 防止关闭具有 GPS 跟踪功能的应用

C 编程 - 编译器告诉我我正在取消引用不完整的类型

c - 用于平台抽象的 Typedef 与容器结构?

c - 结构中的二维数组