gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:02:50 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com