c++ - union 是标准布局类型本身吗?

标签 c++ c++11

如果我有这样的标准布局类型:

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/

相关文章:

C++ , 删除 vector

c++ - 为什么 shared_ptr 引用计数对象也需要跟踪指向该对象的 weak_ptr 上的数字?

c++ - C2227 : left of '->send' must point to class/struct/union/generic type

c++ - 在 C++ 中类型感知字符串到数字的转换

c++ - 函数(给出 mpz_t)未在此范围内声明 c++

c++ - 尝试在 C++11 线程中使用已删除的函数

c++ - 不匹配的 C++ header 版本

c++ - 使用 +(一元加)解决 lambda 的函数指针和 std::function 上的不明确重载

c++ - lambda 模板的匹配函数

c++ - connect-4 类游戏的获胜条件