如果我有这样的标准布局类型:
struct sl_t
{
int a;
};
像这样的 union :
union un_t
{
int b;
double q;
};
我可以转换并使用 union 作为结构类型吗?也就是说,我可以假设 union 本身是标准布局类型并且数据在内存的开头对齐吗?
un_t obj;
sl_t * s = reinterpret_cast<sl_t*>(&obj);
s->a = 15;
assert( obj.b == 15 );
或者我必须取 union 体&obj.b
中变量的地址吗?
请注意,我已经知道如果我将结构存储在 union 中,C++11 标准保证我可以访问 sl_t::a 和 un_t::b,引用 9.5-1。
最佳答案
似乎对齐是你的问题,看看 pragma pack
。结构/union 名称仅引用分配的内存块,如果通过添加更多成员在结构中替换 st_t.a,则您的转换将失败,但如果它仍然是第一个成员,它将起作用,因为 union 的所有成员都指向与 union 本身相同的地址。
请参阅 C++ 标准的第 9.2.17 - 21 节: “指向标准布局结构对象的指针,使用 reinterpret_cast 进行适当转换,指向其初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。”
另见第 9.5 节 union : ” 1、在一个 union 体中,任何时候至多有一个非静态数据成员是活跃的,即任何时候最多有一个非静态数据成员的值可以存储在一个 union 体中。 [注意:为了简化 union 的使用,做出了一个特殊保证:如果标准布局 union 包含多个共享公共(public)初始序列(9.2)的标准布局结构,并且如果此标准布局 union 类型的对象包含标准布局结构之一,允许检查任何标准布局结构成员的公共(public)初始序列;参见 9.2。- 尾注] union 的大小足以包含其最大的非静态数据成员。每个非静态数据成员都被分配为就好像它是结构的唯一成员一样。”
关于c++ - union 是标准布局类型本身吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8201592/