在未对齐的内存上执行reinterpret_cast

reinterpret_cast on unaligned memory

本文关键字:执行 reinterpret cast 内存 对齐      更新时间:2023-10-16

假设以下代码:

struct A
{
    int a;
    int b;
};
char* buffer = receivedFromSomeWhere();
A a = *reinterpret_cast<A*>(buffer + 1);

如果buffer + 0int的大小上对齐,则buffer + 1很可能在未对齐的存储器上。默认的复制构造函数可能会愉快地复制两个未对齐的int成员ab。在x86/x64体系结构上,除了降低代码速度外,它会以任何恶劣的方式影响a的复制构建吗?

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

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

在没有这种保证的情况下,可以使用memcpy将未对齐缓冲区中的字节复制到POD(纯旧数据)对象中。一个好的编译器可以优化这样的访问。

x86/x64体系结构允许不对齐的访问。正如您已经写过的,这可能会对性能产生影响。但由于CPU允许所有操作,因此不会出现其他令人讨厌的问题。

您应该记住,现代处理器中的缓存可以减少内存周期。因此,您将不会有太多的SDRAM周期由未对齐的访问引起。

复制构造函数与问题完全无关。