我需要使用指向错误对齐位置的指针来读取/写入对象。我不想
使用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++ 中,事情并不是那么好:
除非类型可以简单复制,否则不允许进行字节复制。
关于c++ - 如何使用指针合法访问对齐错误的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27930451/