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