从变体获取值时,提升::获取与提升::apply_visitor

boost::get vs boost::apply_visitor when fetching values from a variant

本文关键字:获取 apply visitor 提升      更新时间:2023-10-16

我们在生产代码中广泛使用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提供编译时类型安全值访问并且功能更强大的事实,我是否应该期望上述任一方法在运行时性能方面有任何差异?

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

丢弃一个或两个运行时检查以确保正确的类型被捕获,访问该内存位置应该没有其他成本,重新解释为所需的类型。