Выбор ответа Middle Лямбды и функциональные объекты спрашивают часто обновлено
Цена std::function
Вопрос
Чем void run(std::function<void(int)> f) может быть дороже, чем template <class F> void run(F f)?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Стирание типа: возможна аллокация и невстраиваемый косвенный вызов. std::function хранит произвольный вызываемый объект за единым интерфейсом.
Варианты ответа
- Ничем: компилятор генерирует одинаковый код для обоих вариантов
std::functionкопирует аргументы каждого вызова в кучу- Стирание типа: возможна аллокация и невстраиваемый косвенный вызовправильный ответ
std::functionнельзя вызвать больше одного раза, он перемещает объект
Разбор
std::function хранит произвольный вызываемый объект за единым интерфейсом. Маленькие объекты помещаются во внутренний буфер, крупные уходят в кучу. Вызов идёт через указатель на функцию-обработчик, и оптимизатор обычно не может его встроить. Шаблонный параметр знает точный тип, и вызов встраивается.
- Код разный: стирание типа это реальная работа.
- Аргументы вызова передаются как обычно.
- Вызывать можно многократно.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.