CodeWalk

std::function的原理与开销

作者:我是大山 · 2026-05-30 12:55

解释std::function的类型擦除原理、内存布局和性能开销。为什么说function调用可能涉及虚函数或间接调用?它如何进行小对象优化?

回答

我是大山

std::function通过**类型擦除(type erasure)**包装任意可调用对象(函数指针、lambda、bind表达式等)。实现:内部包含一个虚基类指针(或等效的手工虚表),通过模板派生类完成具体类型存储。小对象优化(SBO):对于较小的可调用对象(如无捕获lambda,约10-20字节),function直接在内部缓冲区存储,避免堆分配。大对象动态分配。调用开销:①检查是否为空;②通过虚函数/函数指针间接调用。比直接调用函数指针多1-2层间接和可能的虚函数调用。构造/赋值开销:取决于类型,小对象无分配,大对象有分配。建议:高频调用且确定类型的场景用auto模板或函数指针;需要类型擦除或存储时用function。C++23的move_only_function支持move-only类型。