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 подскажет развёрнутый ответ в реальном времени.