Boost Variant 本质上是 C/C++ 中的联合?

Posted

技术标签:

【中文标题】Boost Variant 本质上是 C/C++ 中的联合?【英文标题】:Boost Variant essentially a Union in c/c++? 【发布时间】:2013-07-27 19:46:33 【问题描述】:

我想知道 c/c++ 中的 Boost Variant 和 union 数据类型之间有什么区别。我知道union 数据类型占用相同的内存位置,并且内存区域中最大的数据类型占用所使用的内存总量,例如

union space 
   char CHAR;
   float FLOAT;
   int INTEGER;
S;

应该占用 4 个字节的内存,因为 intfloat 是最大且大小相等的。 Boost Variant 和union 数据类型在其他方面是否存在异同? 我也知道 Boost Variant 可以采用任何数据类型,并且它允许数据类型“多态性”(如果我误用了 OOP 主题词,请纠正我)。因此,联合数据类型也是一种多态性吗?

【问题讨论】:

【参考方案1】:

主要区别在于 Boost 的 Variant 知道其中存储了哪种类型,因此您不会犯错误或因误用 Variant 而导致 UB,就像使用 union 一样。这也允许 Variant 采用非 POD(即实际有用的)类型。 Variant 还有一些额外的技巧,例如允许访问者和递归变体。

使用联合的最佳指南是“不要,因为在不调用 UB 的情况下几乎不可能充分利用它们”。这不适用于 Variant,因此推荐更安全。

【讨论】:

什么是“UB”和“POD”? @user2555139 未定义行为和普通旧数据(类型)【参考方案2】:

Boost 变体模拟联合,但在其实现中不使用联合。相反,它使用对齐的存储和放置新。

从某种意义上说,它是多态的,如果您在变体上应用访问者对象,那么它将为您选择正确的重载。此选择必须在运行时发生,但为此的目标代码在编译时展开。所以速度很快。

【讨论】:

以上是关于Boost Variant 本质上是 C/C++ 中的联合?的主要内容,如果未能解决你的问题,请参考以下文章

转:MFC之COleVariant

将由 boost::variant 聚合的类型的对象传递给接受该 boost::variant 的函数

如何返回由 boost::variant 返回类型中包含的类型的子集组成的 boost::variant

Boost::Variant 和其中的 function_types:如何将函数放入 Boost::variant?

boost::variant:递归向量类型的奇怪行为

std::variant 是不是提供类似于 boost::variant<>::types 的功能?