10

假设以下代码:

struct A
{
    int a;
    int b;
};

char* buffer = receivedFromSomeWhere();

A a = *reinterpret_cast<A*>(buffer + 1);

如果buffer + 0在 , 的大小上对齐intbuffer + 1则很可能在未对齐的内存上。默认的复制构造函数可能会愉快地复制两个未对齐的 int 成员ab. 在 x86/x64 架构上,除了减慢代码速度之外,它是否会a以任何讨厌的方式影响副本构建?

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

4

2 回答 2

4

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

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

于 2013-08-08T15:24:47.847 回答
-1

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

您应该记住,现代处理器中的缓存会减少内存周期。所以你不会有那么多由未对齐访问引起的 SDRAM 周期。

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

于 2013-08-08T14:39:09.107 回答