gpt4 book ai didi

c++ - 类型转换内存 union

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:44:58 29 4
gpt4 key购买 nike

我想分配一些内存,将其初始化为一些值,然后将此内存的不同段转换为不同的结构。内容如下:

union structA{
__int8 mem[3];

struct{
unsigned field1 : 8;
unsigned field2 : 12;
unsigned field3 : 4;
};
};

struct structB{
__int8 mem[10];
};


__int8 globalMem[128];

structA a1 <---- &globalMem[0]
structA a2 <---- &globalMem[10]
structB b1 <---- &globalMem[30]

我尝试使用 reinterpret_cast 并且没有收到任何编译器错误,但似乎我的变量(a1a2b1)没有真正正确分配/初始化。

知道为什么这行不通吗?实现类似目标的正确方法是什么?

谢谢!

最佳答案

要实现您打算做的事情,需要使用 reinterpret_cast :

structA a1 = *reinterpret_cast<structA*>(&globalMem[0]);
structA a2 = *reinterpret_cast<structA*>(&globalMem[10]);
structB b1 = *reinterpret_cast<structB*>(&globalMem[30]);

这是怎么回事?

这需要格外小心,因为 C++ struct是一种特殊的 class ,并且这种分配不尊重对象语义(因为不同 globalMem 地址的内容未初始化为正确的对象,除非您在代码中的某处使用 placement new)。

您还可以确保 structA在使用这种技巧之前是可以简单复制的(is_trivially_copyable<structA>::value 幸运的是这里是真的)。

此外,可能存在不遵守对齐约束的问题,如 globalMem没有对齐约束,但取决于编译器/体系结构,structA可能需要单词对齐。

最后,structA的大小不一定像你想的那样是 3。事实上,在某些编译器上它将是 4,如 this online demo

补充说明

您可以使用标准类型 uint8_t而不是以双下划线开头的编译器特定类型名称。

关于对齐和大小主题,我建议您对内存布局假设非常谨慎。我宁愿为你建议 globalMem考虑使它成为它包含的所有结构的结构,以确保正确的对象语义并具有安全的布局。

关于c++ - 类型转换内存 union ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40773080/

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