7

有人知道boost::getfor 是否boost::variant是一个消耗性能的操作

现在,我正在重构性能关键部分中的一些旧代码,其中“变体”是由容器为每种可能的类型和对应enum的 .

显然,这很快,但很难看,现在当我必须重构代码以便它可以与另一种类型一起使用时,我想摆脱代码的旧部分并将其替换为boost::variant.

此外,我不能简单地“分析两个变体并进行比较”,因为这种重构是一件很麻烦的事情,而且会非常耗时。

boost::get<x>因此,如果有人知道与泛型类型调度相比的性能如何enum-based,如果您分享这些知识,我将不胜感激。

还有另一种boost::variant<types>与自定义访问者一起使用的变体(如boost::variant文档中所述) - 这可能比boost::get我的情况更快吗?

谢谢你。

4

2 回答 2

4

您仍然可以编写一个简单的测试应用程序来比较两者,它不必是生产环境。

我的一位同事最近遇到了与此类似的问题。在他的场景中,那里有不同类型的对象,但他总是事先知道他所期望的类型。他的数据结构也很大,所以内存是个问题。void *他通过使用and解决了这个问题reinterpret_cast。这可以防止多态性的内存开销并且非常快。但是,您必须绝对确定自己在做什么,否则事情会爆炸。

于 2010-10-22T13:17:28.190 回答
3

看代码,get<>是使用内部访问者机制实现的boost::variant。反过来,访问者机制依赖于mpl序列,并且是逐步执行的。这意味着在n类型变体上最多n步,但循环(递归调用)在那里。同样,正如 Space Cowboy 所建议的那样,进行小型性能测试会有所帮助。

于 2010-10-22T13:38:14.770 回答