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