Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何合法地使用指针访问错误对齐的对象?_C++_C_Pointers_Memory_Alignment - Fatal编程技术网

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

C++ 如何合法地使用指针访问错误对齐的对象?,c++,c,pointers,memory,alignment,C++,C,Pointers,Memory,Alignment,我需要使用指向错误对齐位置的指针读/写对象。我不想 使用pragma包或其他特定于编译器的功能 起初,我尝试了以下方法: char arr[sizeof (float) * 2]; *(float *)(arr + 1) = 1.0; 但此代码会导致UB,因为它违反了严格的别名规则 如果没有pragma包,下一个代码也将无法工作,因为编译器可能会在:8;之后插入填充 那个么,我可以合法地访问指针指向错误对齐位置的对象吗 我可以一个字节一个字节地将对象复制到所需的位置或memcpy,但我认为

我需要使用指向错误对齐位置的指针读/写对象。我不想 使用pragma包或其他特定于编译器的功能

起初,我尝试了以下方法:

char arr[sizeof (float) * 2];
*(float *)(arr + 1) = 1.0;
但此代码会导致UB,因为它违反了严格的别名规则

如果没有pragma包,下一个代码也将无法工作,因为编译器可能会在:8;之后插入填充

那个么,我可以合法地访问指针指向错误对齐位置的对象吗

我可以一个字节一个字节地将对象复制到所需的位置或memcpy,但我认为这会很慢,所以我正在尝试找到另一种解决方案。
更新:是的,我知道alignas,但它只能增加对齐度,而不能减少对齐度。

您可以始终以C中无符号字符数组的形式访问对象,而不是相反。 由于char的大小和对齐方式为1,因此您可以随意访问内容

虽然C++中的东西不太好,但要注意:
除非类型是可复制的,否则字节复制是不允许的。

但我认为它会很慢。我记得char数组分配有一个例外,它们可以在没有UB的情况下重新解释为另一种指针类型。也许是我编的。你知道alignas吗?你认为它会很慢,或者你知道吗?编译器可以很好地处理具有较小常量大小的memcpy调用。检查assembly.memcpy是否慢,如果慢是因为它可以复制未对齐的数据。你不能两者兼得。
union
{
    struct
    {
        char arr[sizeof (float) * 2]
    } a;
    struct
    {
        : 8;
        float val;
    } b;
} data;
data.b.val = 1.0;