在未对齐的内存上执行reinterpret_cast
reinterpret_cast on unaligned memory
假设以下代码:
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
中对齐),但在我的情况下,我不负责这部分。
C++和使用x86_64体系结构的组合不足以保证支持未对齐的访问。您必须从特定的C++实现中获得额外的保证,即支持以这种方式使用reinterpret_cast
,即使地址未对齐也是如此。如果你说明了你的特定编译器和目标系统,有人可能会告诉你它是否支持这些操作。
在没有这种保证的情况下,可以使用memcpy
将未对齐缓冲区中的字节复制到POD(纯旧数据)对象中。一个好的编译器可以优化这样的访问。
x86/x64体系结构允许不对齐的访问。正如您已经写过的,这可能会对性能产生影响。但由于CPU允许所有操作,因此不会出现其他令人讨厌的问题。
您应该记住,现代处理器中的缓存可以减少内存周期。因此,您将不会有太多的SDRAM周期由未对齐的访问引起。
复制构造函数与问题完全无关。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- C++17中的并行执行策略
- QML按钮点击功能执行顺序
- 程序在执行程序的其余部分之前退出
- 为什么catch中的代码没有被执行
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 将执行、作业和WinAPI相乘
- 对字符数组中的元素执行逐位操作
- 为什么g++在未执行的代码处标记强制转换错误
- 如何使用原子指针执行双缓冲