c++ - 如何使用指针合法访问对齐错误的对象?

标签 c++ c pointers memory alignment

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

相关文章:

c++ - Outlook 插件 - 在 C++ 中获取当前选定的日历日期

c++ - 如何使用静态数组元素作为具有不同模板实例化的对象静态数组的索引

c - 在 C 代码块之前强制执行条件检查

c - 带有 Android NDK 和 C 文件的 Eclipse ADT "... could not be resolved"

c - 将返回的指针分配给变量时出现段错误

c++ - 将数据存储到多维数组中

c++ - 泛型类的 Typedef(别名)

c - st ="hello";在 c 编译器中它显示错误 require Lvalue 这是什么意思为什么这个错误似乎会出现

c - NULL、 '\0' 和 0 有什么区别?

c - 将 char 数组中的指针分配给字符串 C 中的每个单词