如何使用指针合法地访问对齐错误的对象

How can I legally access object with wrong alignment using pointer?

本文关键字:对齐 错误 对象 访问 何使用 指针      更新时间:2023-10-16

我需要使用指向错误对齐位置的指针来读取/写入对象。我不想使用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++事情并不是那么好:
除非类型是简单可复制的,否则不允许字节复制。