对未对齐的内存进行reinterpret_cast

Jiw*_*wan 10 c++

假设以下代码:

struct A
{
    int a;
    int b;
};

char* buffer = receivedFromSomeWhere();

A a = *reinterpret_cast<A*>(buffer + 1);
Run Code Online (Sandbox Code Playgroud)

如果buffer + 0在a的大小上对齐int,buffer + 1则很可能在未对齐的内存上.默认的复制构造函数可能会很高兴地复制两个未对齐的int成员ab.在x86/x64架构上,除了减慢代码之外,它会a以任何令人讨厌的方式影响复制构造吗?

我知道一个好的序列化将解决未对齐的内存问题(通过在某处添加填充以便A结构将在其中对齐buffer),但在我的情况下,我不负责这部分.

Eri*_*hil 4

C++ 与 x86_64 架构的组合不足以保证支持未对齐访问。您必须从特定的 C++ 实现中获得额外的保证reinterpret_cast,即使地址未对齐,也支持使用这种方式。如果您说明您的特定编译器和目标系统,有人可能会告诉您它是否支持这些操作。

如果没有这样的保证,您可以将memcpy字节从未对齐的缓冲区复制到 POD(纯旧数据)对象中。好的编译器可以优化此类访问。