问题 什么是boost :: variant内存和性能成本?


boost :: variant似乎是一个操作异构类型集的强大容器。我想知道它的成本。在内存中,我认为它占用了最大类型的大小加上一个表示哪个()的整数。对于apply_visitor(),我认为它的性能非常好,它可以直接调用除了很多ifs之外的函数。我的观点是对的吗?


3916
2017-10-02 02:42


起源

Boost是开源的。你可以做一些研究和浏览源代码。看起来你已经知道要寻找什么了。 - Ivan Aksamentov - Drop
apply_visitor 在引擎盖下做了“很多ifs”(事实上它更像是一个(大的,元编程的)开关(which())变种。显然,这只是所需的最低工作量。) - sehe


答案:


你几乎是对的。

的大小 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不支持移动构造函数),因为如果链不能很好地执行并且切换是不可能的。


11
2017-10-02 05:28