如何使用指针合法地访问对齐错误的对象
How can I legally access object with wrong alignment using pointer?
我需要使用指向错误对齐位置的指针来读取/写入对象。我不想使用pragma pack
或其他特定于编译器的功能。
起初,我尝试了这个:
char arr[sizeof (float) * 2];
*(float *)(arr + 1) = 1.0;
但是此代码会导致 UB,因为它违反了严格的别名规则。
如果没有pragma pack
,下一个代码也无法工作,因为编译器可能会在: 8;
之后插入填充。
union
{
struct
{
char arr[sizeof (float) * 2]
} a;
struct
{
: 8;
float val;
} b;
} data;
data.b.val = 1.0;
那么,我是否可以合法地使用指向错误对齐位置的指针访问对象?
我可以逐字节将对象复制到所需的位置(或memcpy),但我认为这会很慢,所以我正在尝试寻找另一种解决方案。
更新:是的,我知道
alignas
,但它只能增加对齐,而不是减少对齐。
在 C 中,您始终可以将对象作为unsigned char
数组进行访问(但不是相反)。
由于char
具有大小和对齐方式 1,因此您可以根据需要访问内容。
请注意,C++事情并不是那么好:
除非类型是简单可复制的,否则不允许字节复制。
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 为什么对齐说明符会在 Clang 上抛出错误?
- OPENCL结构对齐错误
- 在 u8 中铸造 u16[] 时如何强制对齐错误?
- 一个粒子太多:GL_INVALID_VALUE生成错误。<start> 不满足着色器存储缓冲区的最低对齐要求
- 64位Windows API结构对齐导致命名管道上出现“拒绝访问”错误
- 什么样的错误会导致忽略对齐
- 错误 C3861:"对齐":找不到标识符
- 如何使用指针合法地访问对齐错误的对象
- 未对齐的访问导致ARM Cortex-M4出现错误
- 返回对齐结构后出现分段错误
- 缓存行、错误共享和对齐
- 使用Visual Studio 2013的动态库使用Eigen时出现内存对齐错误
- 为什么在android清单中关闭可调试会导致数据对齐错误
- DirectX::XMMATRIX 错误 C2719:__declspec(align('16')) 不会对齐
- 抛出对齐类型时出现 Clang 运行时错误.编译器错误