std :: function中的冗余构造函数重载?

时间:2016-01-24 14:29:15

标签: c++ constructor language-lawyer c++14 std-function

根据cppreferencestd::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 );

离开最后一个是不够的?前两个会提供更好的性能(无论如何它们更专业)?如果是这样,怎么办呢?

1 个答案:

答案 0 :(得分:4)

TLDR:这是一项优化

前两个版本将std::function作为参数,而第三个版本采用任意可调用。采用任意可调用类型需要类型擦除,因此在调用std::function时可能会导致函数调用开销,并且可能会创建动态内存分配。

删除前两个重载将使std::function将另一个std::function视为通用可调用和类型擦除该函数,因此最终会调用std::function std::function调用std::function并可能每次都支付动态内存分配。

相反,您会以不同的方式处理std::function而不是存储std::function,而只是存储其他std::function存储的可调用内容,从而降低间接和动态内存分配的级别。