c++ - Boost Variant 本质上是 C/C++ 中的 union ?

标签 c++ c unions boost-variant

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

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

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

最佳答案

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

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

关于c++ - Boost Variant 本质上是 C/C++ 中的 union ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17901826/

相关文章:

c - C中的 union 改变浮点加法的机器行为

c++ - 如何在 Visual Studio 中测试已编译的 DLL(或生成多个可执行文件)?

c++ - 在渲染之外的另一个线程中初始化 OpenGL 上下文

c++ - 这个 C++ AtomicInt 实现正确吗?

C程序: Why does remove() delete a file with no write permissions

c++ - 在这种情况下,C++ 中的 union 做了什么?

c++ - union 类型的模板特化

c++ - 如何检测窗口(gtk、qt 等)应用程序的内存泄漏?

c - 为什么我们不能初始化结构体中的成员?

c - 使用 argp.h 解析为整数