c++ - boost::get vs boost::apply_visitor 从变体中获取值时
问题描述
我们在生产代码中广泛使用 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
只是一块与您提供的最大数据类型对齐的内存块,以及一个指定当前使用这些类型中的哪一个的整数。还有很多允许访问逻辑的编译时宏。
放弃一两次运行时检查以确保正确的类型被抓取,访问该内存位置应该没有其他成本,重新解释为所需的类型。
推荐阅读
- javascript - 如何在 TypeScript/Angular 中的 for 循环后初始化对象的其余部分?
- wpf - 如何在 WPF 中为 Canvas 使用 Style.Triggers
- vba - VBA presentations.open :演示文稿在 End sub 后关闭,但不应该
- php - WCF 服务无应答。PHP 结果错误获取 http 标头,
- pandas - Pandas:使用 apply 将单列数组拆分为列时出现内存错误
- jquery - 如何删除转换:trainsition();从内联样式
- php - MongoDB 按字母顺序排序
- javascript - onBlur 没有在标签上被调用?
- javascript - Papa parse 无法解析字符串,但可以解析打印到控制台的相同字符串
- walmart-api - 调用 Walmart Open API 时出现 CORS 问题