对未对齐的内存进行reinterpret_cast

时间:2013-08-08 14:29:51

标签: c++

假设以下代码:

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中对齐),但在我的情况下,我是对此部分不负责任。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:-1)

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

您应该记住,现代处理器中的缓存会缩短内存周期。因此,您不会因未对齐访问而导致SDRAM周期过多。

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