我需要使用指向错误对齐位置的指针来读取/写入对象。我不想
使用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/

10-11 23:02
查看更多