根据cppreference,std::function
具有以下三个构造函数重载:
template< class Alloc >
function( std::allocator_arg_t, const Alloc& alloc,
const function& other );
template< class Alloc >
function( std::allocator_arg_t, const Alloc& alloc,
function&& other );
template< class F, class Alloc >
function( std::allocator_arg_t, const Alloc& alloc, F f );
离开最后一个是不够的?前两个会提供更好的性能(无论如何它们更专业)?如果是这样,怎么办呢?
答案 0 :(得分:4)
TLDR:这是一项优化
前两个版本将std::function
作为参数,而第三个版本采用任意可调用。采用任意可调用类型需要类型擦除,因此在调用std::function
时可能会导致函数调用开销,并且可能会创建动态内存分配。
删除前两个重载将使std::function
将另一个std::function
视为通用可调用和类型擦除该函数,因此最终会调用std::function
std::function
调用std::function
并可能每次都支付动态内存分配。
相反,您会以不同的方式处理std::function
而不是存储std::function
,而只是存储其他std::function
存储的可调用内容,从而降低间接和动态内存分配的级别。