boost :: variant似乎是一个操作异构类型集的强大容器。我想知道它的成本。在内存中,我认为它占用了最大类型的大小加上一个表示哪个()的整数。对于apply_visitor(),我认为它的性能非常好,它可以直接调用除了很多ifs之外的函数。我的观点是对的吗?
boost :: variant似乎是一个操作异构类型集的强大容器。我想知道它的成本。在内存中,我认为它占用了最大类型的大小加上一个表示哪个()的整数。对于apply_visitor(),我认为它的性能非常好,它可以直接调用除了很多ifs之外的函数。我的观点是对的吗?
你几乎是对的。
的大小 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不支持移动构造函数),因为如果链不能很好地执行并且切换是不可能的。