假设以下代码:
struct A
{
int a;
int b;
};
char* buffer = receivedFromSomeWhere();
A a = *reinterpret_cast<A*>(buffer + 1);
如果buffer + 0
与int
的大小一致,则buffer + 1
最有可能位于未对齐的内存中。默认的复制构造函数可能会很高兴地复制两个未对齐的int成员a
和b
。
在x86 / x64架构上,除了减慢代码速度之外,它会以任何令人讨厌的方式影响a
的副本构造吗?
我知道一个好的序列化可以解决未对齐的内存问题(通过在某处添加填充以便A
结构将在buffer
中对齐),但在我的情况下,我是对此部分不负责任。
答案 0 :(得分:4)
C ++和使用x86_64架构的组合不足以保证支持未对齐的访问。您必须获得特定C ++实现的额外保证,即使地址未对齐,也支持使用reinterpret_cast
这种方式。如果您声明了特定的编译器和目标系统,那么有人可能会告诉您它是否支持这些操作。
如果没有这样的保证,您可以使用memcpy
将字节从未对齐的缓冲区复制到POD(普通旧数据)对象中。一个好的编译器可以优化这种访问。
答案 1 :(得分:-1)
x86 / x64架构允许未对齐访问。正如您已经写过的,这可能会对性能产生影响。但由于CPU允许所有操作,因此不存在其他令人讨厌的问题。
您应该记住,现代处理器中的缓存会缩短内存周期。因此,您不会因未对齐访问而导致SDRAM周期过多。
复制构造函数与问题无关。