全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++中的std::variant和std::any的性能对比_c++类型安全容器选择【C++17】

c++kquote>std::variant 是编译期确定类型的零开销有限多态容器,栈上存储、无虚调用;std::any 是运行期类型擦除的无限多态容器,依赖堆分配、虚函数和类型检查,性能开销显著。

std::variant 和 std::any 都是 C++17 引入的类型安全容器,但设计目标和性能特征差异显著——variant 是编译期确定类型的“有限多态”,any 是运行期擦除类型的“无限多态”。性能上,variant 几乎无额外开销,any 则有动态内存、虚函数调用和类型信息查找等成本。

内存布局与访问开销

std::variant 在栈上直接存储其可选类型的**最大尺寸 + 1 字节(用于存放当前索引)**,访问时通过编译期生成的 switch 或跳转表完成,零运行时类型检查开销。例如:

std::variant v = 42;
// 访问 int:直接取地址偏移,无虚调用、无 new/delete

std::any 则内部持有一个指向堆内存的指针(除非小对象优化 SOO 生效),且每次访问需:

  • 调用 typeid 对比判断类型是否匹配
  • 若匹配,再解引用并 static_cast
  • 构造/析构过程涉及虚函数(如 std::any::holder 的 ~holder())

构造与赋值代价

variant 构造是 trivial 的(若所含类型都 trivial),即使非 trivial 类型,也只调用对应分支的构造函数,无额外抽象层。

any 的构造必然触发一次堆分配(除非 SOO 触发),且需保存类型信息(std::type_info*)和拷贝函数指针;赋值还可能引发新分配+旧释放。例如:

std::any a = std::string(1000, 'x'); // 很可能堆分配
a = 3.14; // 原 string 析构 + 新 double 存储(栈上,但需类型擦除逻辑)

适用场景决定性能取舍

选 variant 当你明确知道所有可能类型,且希望零成本抽象:

  • 解析器返回值(int/double/string/error)
  • 状态机状态(idle/running/paused)
  • AST 节点子类型集合固定

选 any 当你需要真正泛化的容器,比如插件系统参数、配置项、反射字段值:

  • 任意类型值的 map:std::map<:string std::any>
  • 回调函数参数打包
  • 无法在编译期枚举全部类型的场景

小对象优化(SOO)的影响

some std::any 实现(如 libstdc++ 和 MSVC)支持 SOO:对 sizeof ≤ 约 16–32 字节且无抛出析构的类型,直接存栈上,避免堆分配。但这不改变其运行时类型查询和虚函数调用的本质开销。

variant 没有 SOO 概念——它天生栈驻留,大小和访问路径完全静态可知。即使含 std::string,variant 仍只预留 max_size,不触发任何动态行为(除非你主动调用 string 的构造函数)。

基本上就这些。不是“哪个更快”,而是“哪个更合适”——variant 快得理所当然,any 慢得情有可原。用错场景,再快的 any 也救不了设计缺陷;用对地方,variant 的零成本就是最硬的性能保障。


# 字节  # 回调函数  #   # c++  # switch  # String  # 多态  # 子类  # 构造函数  # Error  # int  # double  # 指针  # 虚函数  #   # map  # 对象  # 当你  # 擦除  # 都是  # 情有可原  # 很可能  # 更快  # 但这  # 可选  # 跳转 


相关文章: 如何快速使用云服务器搭建个人网站?  如何选择高效响应式自助建站源码系统?  七夕网站制作视频,七夕大促活动怎么报名?  建站主机解析:虚拟主机配置与服务器选择指南  如何挑选最适合建站的高性能VPS主机?  建站之星CMS五站合一模板配置与SEO优化指南  如何高效利用200m空间完成建站?  用v-html解决Vue.js渲染中html标签不被解析的问题  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  独立制作一个网站多少钱,建立网站需要花多少钱?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Android自定义控件实现温度旋转按钮效果  网站制作知乎推荐,想做自己的网站用什么工具比较好?  红河网站制作公司,红河事业单位身份证如何上传?  网站制作免费,什么网站能看正片电影?  如何快速登录WAP自助建站平台?  太平洋网站制作公司,网络用语太平洋是什么意思?  建站之星收费标准详解:套餐费用及年费价格表一览  如何在VPS电脑上快速搭建网站?  网站制作价目表怎么做,珍爱网婚介费用多少?  高端建站三要素:定制模板、企业官网与响应式设计优化  平台云上自助建站如何快速打造专业网站?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  如何在服务器上配置二级域名建站?  活动邀请函制作网站有哪些,活动邀请函文案?  如何在云主机上快速搭建网站?  广州美橙建站如何快速搭建多端合一网站?  ui设计制作网站有哪些,手机UI设计网址吗?  建站之星北京办公室:智能建站系统与小程序生成方案解析  如何在阿里云通过域名搭建网站?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  如何在建站之星绑定自定义域名?  ,在苏州找工作,上哪个网站比较好?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  制作网站怎么制作,*游戏网站怎么搭建?  建站之星后台管理如何实现高效配置?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  网站app免费制作软件,能免费看各大网站视频的手机app?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  在线制作视频的网站有哪些,电脑如何制作视频短片?  IOS倒计时设置UIButton标题title的抖动问题  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  实现虚拟支付需哪些建站技术支撑? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。