Mediumfinalоптимизация
Чем final полезен для девиртуализации?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
final на методе запрещает переопределение в дальнейших производных классах; на классе — запрещает наследование. Помимо семантической роли, final даёт оптимизацию: компилятор знает, что нет переопределений, и может девиртуализировать вызов.
class Base { public: virtual void f(); virtual ~Base() = default; };
class Fast final : public Base {
public:
void f() final; // компилятор может девиртуализировать
};
void loop(Base* b) {
b->f(); // обычно indirect через vtable
}
Fast f;
Fast* pf = &f;
pf->f(); // прямой call, может инлайниться — final позволяет- Девиртуализация заменяет indirect через vtable на прямой call, инлайн — заметный speedup в hot loops;
- Применять когда класс не предназначен для наследования или метод не должен переопределяться;
- Осторожно: может усложнить будущие расширения (mocking в тестах).
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.