2015-01-12 2 views
4
  • Есть ли разница?std :: function vs function pointer

  • Каков наилучший способ «сохранить/передать»?

    function<void(int)> fcn = 
            [](int par) {std::cout<<"fcn: "<<par<<std::endl; }; 
    void(*fcn_a)(int) = 
            [](int par) {std::cout<<"fcn_a: "<<par<<std::endl; }; 
    
    
    fcn(12); 
    fcn_a(12); 
    

ответ

5

std::function является более универсальным - вы можете хранить в нем любой вызываемый объект с правильной подписью (указатель функции, указатель метод, объект с operator()), и вы можете построить std::function с помощью std::bind.

Функциональный указатель может принимать только функции с правильной подписью, но может быть немного быстрее и может генерировать несколько меньший код.

5

В случае несобранного лямбда с использованием указателя функции будет работать быстрее, чем при использовании std::function. Это связано с тем, что std::function является гораздо более общим зверем и использует стирание типа для хранения переданного ему объекта функции. Он достигает этого путем стирания стилей, подразумевая, что вы получаете вызов operator(), являющийся виртуальным.

OTOH, не захватывающие lambdas, неявно конвертируются в соответствующий указатель функции. Если вам требуется полноценное закрытие, вам придется назначить лямбда std::function или полагаться на вычет типа через шаблоны, когда это возможно.

 Смежные вопросы

  • Нет связанных вопросов^_^