15

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

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

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

4

2 回答 2

16

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

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

于 2013-07-27T20:08:25.130 回答
12

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

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

于 2013-07-27T19:56:15.823 回答