Весь смысл виртуальных функций в том, что компилятор обычно не знает, какая из реализаций производного класса понадобится во время выполнения, или даже если дополнительные производные классы будут динамически загружаться из разделяемых библиотек.Так что, в общем, встроить невозможно.Единственный случай, когда компилятор может встроить , - это когда он точно знает, с каким типом он имеет дело, потому что он может видеть конкретный тип в коде и вскоре после этого - без шансов на изменение типа -увидеть вызов виртуальной функции.Даже в этом случае не требуется , чтобы попытаться оптимизировать или встроить, это единственный случай, когда это даже возможно.
Вы не должны пытаться бороться с этим, если профилировщик не доказал виртуальные вызовыубивают тебяЗатем сначала попытайтесь сгруппировать несколько операций, чтобы один виртуальный вызов мог сделать больше за вас.Если виртуальная диспетчеризация все еще слишком медленная, подумайте о поддержании какого-то различающегося объединения: оно намного менее гибкое и чисто расширяемое, но может избежать издержек при вызове виртуальной функции и разрешить встраивание.
Все, что предполагает, что вам действительно нужнодинамическая диспетчеризация: некоторые программисты и системы чрезмерно используют виртуальные функции только потому, что OO был в разработке 20 лет назад, или они использовали язык только для OO, такой как Java.C ++ имеет богатый выбор полиморфных механизмов времени компиляции, включая template
s.