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 个字节的内存,因为 int
和 float
是最大且大小相等的。 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++ 中的联合?的主要内容,如果未能解决你的问题,请参考以下文章
将由 boost::variant 聚合的类型的对象传递给接受该 boost::variant 的函数
如何返回由 boost::variant 返回类型中包含的类型的子集组成的 boost::variant