我想知道在c / c ++中Boost Variant和union
数据类型之间的区别是什么。我知道union
数据类型占用相同的内存位置,并且内存区域中最大的数据类型占用了所使用的内存总量,例如。
union space {
char CHAR;
float FLOAT;
int INTEGER;
}S;
应该占用4个字节的内存,因为int
和float
是最大且相同的大小。 Boost Variant和union
数据类型之间在其他方面是否存在相似之处和不同之处?
我也知道Boost Variant可以采用任何数据类型,它允许数据类型“多态”(如果我滥用OOP主题词,请纠正我)。因此,union数据类型也是一种多态性吗?
答案 0 :(得分:16)
主要区别在于Boost的Variant知道哪个类型存储在其中,所以你不能犯错误或让UB以与联合相同的方式滥用Variant。这也允许Variant采用非POD(即实际有用)类型。 Variant还有一些额外的技巧,例如允许访问者和递归变体。
使用工会的最佳指南是“不要,因为在不调用UB的情况下几乎不可能充分利用它们”。这不适用于Variant,因此推荐它会更加安全。
答案 1 :(得分:11)
Boost变体模拟联合,但它的实现中不使用联合。相反,它使用对齐的存储和放置新。
在某种意义上它是多态的,如果你在一个变体上应用访问者对象,那么它将为你选择正确的重载。此选择必须在运行时进行,但在编译时将展开此对象代码。所以它很快。