Есть ли разница?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);
ответ
std::function
является более универсальным - вы можете хранить в нем любой вызываемый объект с правильной подписью (указатель функции, указатель метод, объект с operator()
), и вы можете построить std::function
с помощью std::bind.
Функциональный указатель может принимать только функции с правильной подписью, но может быть немного быстрее и может генерировать несколько меньший код.
В случае несобранного лямбда с использованием указателя функции будет работать быстрее, чем при использовании std::function
. Это связано с тем, что std::function
является гораздо более общим зверем и использует стирание типа для хранения переданного ему объекта функции. Он достигает этого путем стирания стилей, подразумевая, что вы получаете вызов operator()
, являющийся виртуальным.
OTOH, не захватывающие lambdas, неявно конвертируются в соответствующий указатель функции. Если вам требуется полноценное закрытие, вам придется назначить лямбда std::function
или полагаться на вычет типа через шаблоны, когда это возможно.