作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
假设以下代码:
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(普通旧数据)对象中。一个好的编译器可以优化此类访问。
关于c++ - 在未对齐的内存上重新解释_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18128701/
我是一名优秀的程序员,十分优秀!