Делайте как STL и не используйте виртуальные методы в итераторе или контейнерах. Большинство компиляторов, когда их просят оптимизировать, могут оптимизировать большинство итераторов STL до такой степени, что они полностью обойдены и даже не существуют в объектном файле. Например, *(vector<T>.begin()+5)
можно оптимизировать до vector<T>.<em>_</em>_underlying_array[5]
, даже если vector<T>::iterator
- это сложный класс с конструкторами, деструкторами и переопределениями сложных операторов.
Наличие виртуального вызова метода в любом месте стека вызовов operator++
, begin()
, end()
или operator !=()
не позволяет компилятору корректно оптимизировать это, поскольку метод может быть переопределен любым способом. виртуальные методы не только имеют небольшие накладные расходы времени выполнения, они делают код неоптимизируемым, делая его более модульным.
Если вы хотите повысить производительность, рассмотрите возможность использования шаблонов вместо наследования или настройте компилятор, сказав, что никто не наследует этот класс. Это может конфликтовать с вашим текущим дизайном, но вам нужно выбрать два приоритета среди этих трех: производительность, модульность и стоимость.