从变量获取值时,boost :: get与boost :: apply_visitor

时间:2019-01-04 03:34:24

标签: c++ boost boost-variant

我们在生产代码中广泛使用了boost :: variant的集合。 我们从此集合中提取值的方式是

for (auto & var : vars)
{
    switch (var.which())
    {
        case 1 :
        AVal = boost::get<A>(var);
        break;
        case 2 :
        BVal = boost::get<B> (var);
        ...
     } 
}

阅读有关变体的更多信息,我可以看到另一种替代方法

for (auto & var : vars)
{
    switch (var.which())
    {
        case 1 :
        AVal = boost::apply_visitor(AVisitor, var);
        break;
        case 2 :
        BVal = boost::apply_visitor(BVisitor, var);
        ...
    } 
}

忽略了apply_visitor提供编译时类型安全值访问并且功能更强大的事实,我是否应该期望上述两种方法在运行时性能方面有任何区别?

1 个答案:

答案 0 :(得分:0)

boost::variant只是一块内存,它与您提供的最大数据类型对齐,并且是一个整数,用于指定当前使用的是哪种类型。还有许多允许访问逻辑的编译时宏。

丢弃一次或两次运行时检查以确保获取正确的类型,访问该内存位置(重新解释为所需的类型)应该没有其他开销。