std::function 中的冗余构造函数重载?
Redundant constructor overloads in std::function?
根据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 );
只留下最后一个不行吗?前两个是否会提供更好的性能(无论如何它们更专业)?如果可以,怎么实现?
TLDR:这是一个优化
前两个版本采用 std::function
s 作为参数,而第三个版本采用任意可调用。采用任意可调用对象需要类型擦除,因此在调用 std::function
时最终会产生函数调用开销,并且可能需要为创建动态分配内存。
删除前两个重载将使 std::function
将另一个 std::function
视为通用可调用函数并 type-erase 该函数,因此您最终会得到一个 std::function
调用std::function
调用 std::function
并可能每次都支付动态内存分配。
相反,您以不同的方式对待 std::function
,而不是存储 std::function
,您只存储另一个 std::function
存储的可调用对象,从而减少间接级别和动态内存分配。
根据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 );
只留下最后一个不行吗?前两个是否会提供更好的性能(无论如何它们更专业)?如果可以,怎么实现?
TLDR:这是一个优化
前两个版本采用 std::function
s 作为参数,而第三个版本采用任意可调用。采用任意可调用对象需要类型擦除,因此在调用 std::function
时最终会产生函数调用开销,并且可能需要为创建动态分配内存。
删除前两个重载将使 std::function
将另一个 std::function
视为通用可调用函数并 type-erase 该函数,因此您最终会得到一个 std::function
调用std::function
调用 std::function
并可能每次都支付动态内存分配。
相反,您以不同的方式对待 std::function
,而不是存储 std::function
,您只存储另一个 std::function
存储的可调用对象,从而减少间接级别和动态内存分配。