boost :: variant似乎是一个操纵异构类型集的强大容器。我想知道它的成本。在内存中,我认为它占用了最大类型的大小加上一个表示哪个()的整数。对于apply_visitor(),我认为它的性能非常好,它可以直接调用除了很多ifs之外的函数。我的观点是对的吗?
答案 0 :(得分:11)
你几乎是对的。
boost::variant
的大小是任何元素的最大大小,根据最大对齐的需要向上舍入,再加上某个整数的大小,并再次向上舍入。
考虑这些类型的变体,假设标记为uint32_t
:
struct foo { uint32_t value[3]; }; // size 12, align 4
struct bar { uint64_t v2; }; // size 8, align 8
未标记的联合必须大小为16,对齐8;添加4字节标记必须达到24,以保持对齐8.
或考虑以下的变体:
struct foo { uint8_t value[5]; }; // size 5, align 1
struct bar { uint16_t v2; }; // size 2, align 2
这些未标记的联合必须具有6,对齐2;添加4字节标记会强制您调整大小为12,对齐4。
对于调用,我希望它使用函数数组查找(这就是我如何实现我自己的变体,这是必要的,因为boost不支持移动构造函数),因为如果链不能很好地执行并且交换机是不可能的。