Mediumvirtualperformance

Почему нужно избегать virtual функций в hot paths?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Virtual-вызов дороже обычного: indirect call через vtable (2 memory loads), возможен branch misprediction, невозможность inline.

// Virtual — indirect call, нет inline
struct Shape { virtual double area() const = 0; };
double total(Shape** shapes, int n) {
    double s = 0;
    for (int i = 0; i < n; ++i)
        s += shapes[i]->area();   // virtual в hot loop
    return s;
}

// CRTP — статический полиморфизм, прямой вызов, inline
template<class Derived>
struct ShapeBase {
    double area() const { return static_cast<const Derived*>(this)->areaImpl(); }
};

// std::variant + visit — тоже без virtual
using ShapeV = std::variant<Circle, Square>;
double total(std::vector<ShapeV>& shapes);

Альтернативы в hot paths: CRTP, devirtualization (LTO), std::variant+visit. Virtual — для обычного ООП, не для performance-critical.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.