类型擦除是C++中通过统一接口隐藏具体类型、实现运行时多态的惯用法,典型应用有std::function、std::any等;其核心是控制块封装构造/拷贝/析构/调用函数指针,并常结合小对象优化避免堆分配。
类型擦除(Type Erasure)是 C++ 中一种实现“运行时多态但不依赖继承”的高级技巧,核心思想是:**把具体类型的接口统一包装成某个固定接口,在外部完全隐藏底层类型信息**。它不是语言特性,而是一套惯用法(idiom),std::function、std::any、std::variant(部分)、boost::any 等都是其典型应用。
传统虚函数多态要求所有类型继承同一基类,且必须在编译期确定继承关系;而 std::function 要能存储任意可调用对象(lambda、函数指针、bind 表达式、仿函数类……),它们彼此毫无继承关系,类型千差万别。类型擦除绕开了继承约束,靠“间接层 + 统一接口 + 动态分发”达成泛化存储与调用。
std::function 的关键在于内部持有一个指向**类型无关的虚函数表(vtable)风格函数指针集合**的指针,以及一块能容纳各种大小对象的缓冲区(小对象优化 SOO)。它不直接存 T,而是存一个“类型擦除后的控制块(control block)”,该控制块里封装了:构造、拷贝、析构、调用这四类操作的函数指针。
例如,当你写:
std::function
编译器会为这个 lambda 生成一个匿名类型(比如 lambda_abc123),然后在堆上(或栈内 SOO 区域)构造一个控制块,其中:
std::function 对象本身只保存一个 void* 指针(指向数据)和一组函数指针(指向上述操作),对外彻底屏蔽了 lambda 的真实类型。
以下是一个仅支持无参无返回值 callable 的简化版:
class any_callable {
struct concept {
virtual ~concept() = default;
virtual void invoke() = 0;
virtual concept* clone() const = 0;
};
template
struct model : concept {
T data;
model(T&& x) : data(std::move(x)) {}
void invoke() override { data(); }
concept* clone() const override { return new model{data}; }
};
std::unique_ptr
public:
template
any_c
allable(F&& f) : p(std::make_unique
void operator()() { p->invoke(); }
};
这就是类型擦除的本质:用基类指针(concept*)抹去 T 的身份,靠模板特化(model
真实 std::function 通常不总用 new —— 它会在对象内部预留一小段内存(如 32 字节),若待存 callable 的大小 ≤ 该阈值,就直接 placement-new 到内部缓冲区,避免堆分配开销。这需要对齐计算、类型大小/对齐检查、手动调用构造/析构等底层操作,也是其实现复杂的关键原因之一。
SOO 带来两个关键判断逻辑:
std::function 的 move 构造/赋值也高度依赖 SOO 状态,需区分“堆上对象”和“内嵌对象”分别处理。
基本上就这些。类型擦除不是魔法,它是以空间换灵活、以间接换通用的工程权衡——理解它,你就看懂了现代 C++ 泛型库的骨架之一。
# 字节
# 栈
# c++
# 为什么
# 封装
# 多态
# 析构函数
# const
# int
# void
# Lambda
# 指针
# 继承
# 虚函数
# 接口
# 堆
# class
# public
# Struct
# operator
# 泛型
# copy
# function
# 对象
# default
# 擦除
# 一个函数
# 都是
# 是一个
# 特化
# 你就
# 这就是
# 是怎么
# 千差万别
相关文章:
学校为何禁止电信移动建设网站?
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
c# Task.ConfigureAwait(true) 在什么场景下是必须的
建站之星微信建站一键生成小程序+多端营销系统
如何在建站之星绑定自定义域名?
宝塔面板如何快速创建新站点?
如何在IIS中新建站点并配置端口与IP地址?
如何选择靠谱的建站公司加盟品牌?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
网站制作服务平台,有什么网站可以发布本地服务信息?
制作网站的软件免费下载,免费制作app哪个平台好?
宁波免费建站如何选择可靠模板与平台?
网站制作难吗安全吗,做一个网站需要多久时间?
如何在阿里云香港服务器快速搭建网站?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
如何用好域名打造高点击率的自主建站?
内网网站制作软件,内网的网站如何发布到外网?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
平台云上自主建站:模板化设计与智能工具打造高效网站
如何在IIS7上新建站点并设置安全权限?
导航网站建站方案与优化指南:一站式高效搭建技巧解析
表情包在线制作网站免费,表情包怎么弄?
建站之星后台密码如何安全设置与找回?
建站主机是什么?如何选择适合的建站主机?
建站之星如何修改网站生成路径?
如何快速查询网站的真实建站时间?
建站之星展会模板:智能建站与自助搭建高效解决方案
广州美橙建站如何快速搭建多端合一网站?
开源网站制作软件,开源网站什么意思?
如何快速上传自定义模板至建站之星?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
深圳网站制作案例,网页的相关名词有哪些?
如何选择高性价比服务器搭建个人网站?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
学校建站服务器如何选型才能满足性能需求?
制作电商网页,电商供应链怎么做?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
免费网站制作appp,免费制作app哪个平台好?
如何快速生成凡客建站的专业级图册?
如何通过FTP服务器快速搭建网站?
网站制作企业,网站的banner和导航栏是指什么?
建站之星价格显示格式升级,你的预算足够吗?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
建站为何优先选择香港服务器?
家庭服务器如何搭建个人网站?
无锡营销型网站制作公司,无锡网选车牌流程?
如何通过可视化优化提升建站效果?
c++怎么用jemalloc c++替换默认内存分配器【性能】
*请认真填写需求信息,我们会在24小时内与您取得联系。