Использование виртуальных функций может замедлить работу программы по нескольким причинам:
- Косвенность вызова. 1 Виртуальные методы обычно реализуются с помощью таблиц виртуальных методов, в которых хранятся указатели на функции. 1 Чтобы вызвать виртуальную функцию, нужно получить адрес вызываемой функции из виртуальной таблицы, затем вызвать её. 1 Это требует времени и дополнительного кода. 1
- Отсутствие оптимизации от компилятора. 1 Обычно компилятор не может знать, какая функция будет вызвана, поэтому не может встроить её или выполнить другие оптимизации. 1 Это может добавить бессмысленные инструкции и препятствовать другим оптимизациям. 1
- Частый вызов. 4 Если вызывать виртуальные функции сотни тысяч раз в секунду и чаще, то даже при обычном прямом вызове такие функции будут сильно тормозить. 4
Однако в большинстве случаев потери производительности при использовании виртуальных функций слишком малы, чтобы иметь значение. 1 Кроме того, в C++ вызовы виртуальных функций не всегда являются динамическими: когда точный тип объекта известен, то вызовы являются обычными вызовами функций-членов и не требуют дополнительных затрат. 1