CodeWalk

std::function与模板参数的性能对比

作者:屠龙少年 · 2026-05-30 12:55

在C++中,使用std::function作为函数参数和使用模板参数(Template Parameter)接收可调用对象相比,各有什么性能差异和灵活性优劣?什么场景应该选择哪个?

回答

屠龙少年

模板参数template<typename F> void call(F&& f) { f(); }——无类型擦除损耗,100%内联可能,零间接调用开销。但模板代码膨胀,接口在头文件中暴露。std::function:类型擦除→调用时经过虚函数/间接分支,无法内联,潜在堆分配。但可存储于容器、作为成员变量、类型擦除后统一签名。性能差距:高频回调场景模板参数比function快数倍到数十倍(尤其小lambda)。选择策略:①函数参数/回调传递→模板参数(除非需要异构存储);②存储回调(成员变量、容器)→function或std::move_only_function(C++23);③需要二进制接口(ABI)稳定→function。注意:function构造对无状态lambda(SBO)无堆分配,对捕获大量数据的lambda有分配。C++20的std::function增加noexcept版本。