Действительно, с std:function
существуют проблемы с производительностью, которые необходимо учитывать при его использовании. Основная сила std::function
, а именно его механизм стирания типов, не предоставляется бесплатно, и мы могли бы (но не обязательно должны) заплатить за это цену.
std::function
- это шаблонный класс, который оборачивает вызываемые типы. Однако он не параметризован для самого вызываемого типа, а только для его типов возврата и аргументов. Вызываемый тип известен только во время создания, и поэтому std::function
не может иметь предварительно объявленный член этого типа для хранения копии объекта, переданного его конструктору.
Грубо говоря (на самом деле все сложнее, чем это) std::function
может содержать только указатель на объект, переданный его конструктору, и это вызывает проблему на всю жизнь. Если указатель указывает на объект, время жизни которого меньше, чем у объекта std::function
, то внутренний указатель станет висящим. Чтобы предотвратить эту проблему, std::function
может сделать копию объекта в куче посредством вызова operator new
(или пользовательского распределителя). Динамическое распределение памяти - это то, что люди больше всего называют ухудшением производительности, подразумеваемым std::function
.
Недавно я написал статью с более подробной информацией, которая объясняет, как (и где) можно избежать расплаты за выделение памяти.
http://drdobbs.com/cpp/232500059