Выбор ответа Middle Лямбды и функциональные объекты спрашивают часто обновлено

Цена std::function

Вопрос

Чем void run(std::function<void(int)> f) может быть дороже, чем template <class F> void run(F f)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Стирание типа: возможна аллокация и невстраиваемый косвенный вызов. std::function хранит произвольный вызываемый объект за единым интерфейсом.

Варианты ответа

  1. Ничем: компилятор генерирует одинаковый код для обоих вариантов
  2. std::function копирует аргументы каждого вызова в кучу
  3. Стирание типа: возможна аллокация и невстраиваемый косвенный вызовправильный ответ
  4. std::function нельзя вызвать больше одного раза, он перемещает объект

Разбор

std::function хранит произвольный вызываемый объект за единым интерфейсом. Маленькие объекты помещаются во внутренний буфер, крупные уходят в кучу. Вызов идёт через указатель на функцию-обработчик, и оптимизатор обычно не может его встроить. Шаблонный параметр знает точный тип, и вызов встраивается.

  • Код разный: стирание типа это реальная работа.
  • Аргументы вызова передаются как обычно.
  • Вызывать можно многократно.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.