在C/c ++中,Boost Variant本质上是一个联盟?

pan*_*ami 15 c c++ boost-variant unions

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

union space {
   char CHAR;
   float FLOAT;
   int INTEGER;
}S;
Run Code Online (Sandbox Code Playgroud)

应该占用4个字节的内存,int并且float是最大和相同的大小.Boost Variant和union数据类型之间在其他方面是否存在相似之处和不同之处?我也知道Boost Variant可以采用任何数据类型,它允许数据类型"多态"(如果我滥用OOP主题词,请纠正我).因此union数据类型也是一种多态性吗?

Pup*_*ppy 16

主要区别在于Boost的Variant知道哪个类型存储在其中,因此您不会犯错误或让UB以与联合相同的方式滥用Variant.这也允许Variant采用非POD(即实际有用)类型.Variant还有一些额外的技巧,例如允许访问者和递归变体.

使用工会的最佳指南是"不要,因为在不调用UB的情况下几乎不可能很好地使用它们".这不适用于Variant,因此推荐它更安全.

  • 什么是"UB"和"POD"? (4认同)
  • @ user2555139未定义的行为和普通的旧数据(类型) (3认同)

Sta*_*ked 12

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

在某种意义上它是多态的,如果你在一个变体上应用访问者对象,那么它将为你选择正确的重载.此选择必须在运行时进行,但在编译时将展开此对象代码.所以它很快.