首页/新闻资讯/正文详情

CRTP 编译期多态与静态接口:没有虚函数也能多态

发布时间:2026/9/25 19:40:40 来源:云帆数科 栏目:资讯中心
CRTP 编译期多态与静态接口:没有虚函数也能多态
继承 + 虚函数不是 C++ 里实现「一套接口、多种实现」的唯一路子。如果你想要的是编译期就定下来的多态——没有运行期查虚表(virtual table,vtable)、调用能被内联(inline)、对象还更小——CRTP 就是这个需求的标准答案。这篇用真跑出来的sizeof和计数器实例,把 CRTP 到底是什么、为什么快、代价是什么讲清楚。1. 引子:虚函数到底「贵」在哪写惯了面向对象的人,要统一操作一批类型第一反应是抽个基类、把行为声明成virtual:structShape{virtualvoiddraw()=0;virtual~Shape()=default;};structCircle:Shape{voiddraw()override{/* ... */}};这没问题,但隐藏三笔账:每个对象多一个 vptr(虚表指针)、每次调用draw()都要「取 vptr → 查表 → 跳转到函数」的间接跳转(indirect branch,会打分支预测)、整个类层级多了虚表数据。对性能敏感、或对象极多的场景,这三笔账可能不划算。CRTP 的卖点就是——把这些账全免了,代价是把「多态」从运行期挪到编译期。官方文档:Curiously recurring template pattern — cppreference2. CRTP 长什么样:派生类把自己喂给基类CRTP 的骨架就一句话:基类是个模板,派生类继承「以自己为模板参数的基类」。// crtp_basic.cpp — 编译: g++ -std=c++17 -Wall -O2 crtp_basic.cpp -o cb#includecstdiotemplateclassDerivedstructShape{voiddraw()const{static_castconstDerived*(this)-draw_impl();}};structCircle:ShapeCircle{voiddraw_impl()const{std::puts("Circle::draw");}};structSquare:ShapeSquare{voiddraw_impl()const{std::puts("Square::draw");}};intmain(){Circle c;c.draw();Square s;s.draw();

相关推荐

enum class 为什么优于裸 enum:作用域、类型安全与内存实测
enum class 为什么优于裸 enum:作用域、类型安全与内存实测

很多 C++ 初学者写枚举时随手就写 enum Color { red, green, blue };,编译器也不报错,于是就一直这么用。直到某天两个枚举的同名值撞了、或者一个本该是「颜色」的变量被悄悄当成整数参与运算,bug 藏得很深。C++11 引入的 enum class(枚举类,scoped enumeration)就是为解… · 2026/9/24 17:44:52

const 该放哪:从顶层 const 到 const 成员函数
const 该放哪:从顶层 const 到 const 成员函数

const 在 C++ 里不是「加个修饰」那么简单——放在 * 左边还是右边,含义完全不同;放在成员函数末尾,改的甚至是隐藏的 this 指针类型。搞混这两者,轻则编译报错,重则写出自以为只读、其实能改的接口。这篇把 const 的位置语义、它对函数签名和性能的影响,用代码和真实输出… · 2026/9/24 17:44:52

第032篇 面试必问·网易浏览器与渲染原理:浏览器缓存机制,强缓存与协商缓存如何配合(压箱底干货)
第032篇 面试必问·网易浏览器与渲染原理:浏览器缓存机制,强缓存与协商缓存如何配合(压箱底干货)

摘要:本篇复盘 网易 前端开发岗位在 浏览器与渲染原理 方向的真实问法,重点拆 8 道题:限流算法有哪些,各适合什么场景、浏览器缓存机制,强缓存与协商缓存如何配合、浏览器事件模型,事件委托有什么好处。每题按「考察点 → 参考答案 → 代码/实操 → 易错点 → 面试官追问… · 2026/9/24 17:44:52

诺顿卸载不干净?深度解析Windows驱动级驻留与彻底清理方案
诺顿卸载不干净?深度解析Windows驱动级驻留与彻底清理方案

1. 这不是普通卸载:诺顿在Windows系统里到底“扎根”到了什么程度? 很多人点开“控制面板→程序和功能”,找到Norton杀毒软件,点“卸载”,等进度条走完,弹出“卸载成功”,就以为万事大吉——结… · 2026/9/25 19:40:35

伊莫怎么样 伊莫好玩吗
伊莫怎么样 伊莫好玩吗

很多玩家最近都在问伊莫怎么样,这款主打回合策略与角色叙事的二次元新游有着独特的美术风格与深度角色养成体系,伊莫怎么样,它摒弃繁杂冗余的日常任务,把重心放在角色剧情与策略配队上,喜欢策略博弈和角色故事的玩家可… · 2026/9/25 19:40:35

283基于SpringBoot4+Vue3的校园求职招聘系统、大学生就业招聘平台、校园招聘管理系统、高校求职小程序、实习校招管理系统;毕业设计、课程设计
283基于SpringBoot4+Vue3的校园求职招聘系统、大学生就业招聘平台、校园招聘管理系统、高校求职小程序、实习校招管理系统;毕业设计、课程设计

✅博主简介:Java全栈开发工程师(bishecoder),精通Java开发、系统设计、项目实战。 ✅技术栈:SpringBoot、Vue、React、Node.js、Nest.js、uni-app等 ✅技术擅长:定制项目、修改代码、编写文档、技术指导等。… · 2026/9/25 19:40:35

MP4打不开真相:解码器缺失与硬件加速冲突
MP4打不开真相:解码器缺失与硬件加速冲突

1. 为什么MP4文件在电脑上“打不开”根本不是文件本身的问题“电脑MP4格式视频打不开”——这句话每天在各大技术论坛、客服后台、家庭微信群里重复出现上千次。但绝大多数人一上来就怀疑“是不是文件坏了”“是不是下载不完整”“是不是手机录的视频电脑不认”,这种… · 2026/9/25 19:40:35

Linux USB协议栈深度解析:从设备枚举到驱动加载的全流程
Linux USB协议栈深度解析:从设备枚举到驱动加载的全流程

1. 这不是教科书里的“协议栈”——它是一条活的、会呼吸的数据流水线你打开Linux终端敲下lsusb,屏幕上跳出一串带ID的设备列表;你插上U盘,dmesg日志里瞬间刷出十几行“new high-speed USB device”;你用usbmon抓包,看… · 2026/9/25 19:40:29

LibreChat自托管部署指南:统一接入多模型API,打造私有AI聊天平台
LibreChat自托管部署指南:统一接入多模型API,打造私有AI聊天平台

生活中大概都会有那么一个时刻:ChatGPT里想到一个答案,Claude那边写出来的更好,Gemini在某些任务上又是一套逻辑,于是你不得不在几个网页之间来回切换,账号、聊天历史、订阅费用全都散落在不同的地方。我第一次把Libre… · 2026/9/25 19:40:29

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码