Скажем, что у меня есть вызов виртуальной функции foo() в указателе базового класса mypointer- > foo(). Когда мое приложение запускается, основываясь на содержимом файла, он выбирает экземпляр конкретного конкретного класса и назначает mypointer этому экземпляру. Для остальной части приложения, mypointer всегда будет указывать на объекты этого конкретного типа. Я не знаю, что такое конкретный тип (он может быть создан factory в динамически загруженной библиотеке). Я знаю только, что тип останется прежним после того, как будет сделан экземпляр конкретного типа. Указатель может не всегда указывать на один и тот же объект, но объект всегда будет иметь один и тот же конкретный тип. Обратите внимание, что тип технически определен в "runtime", потому что он основан на содержимом файла, но после "запуска" (файл загружен) тип исправлен.
Однако в С++ я оплачиваю стоимость поиска виртуальной функции каждый раз, когда вызывается foo для всей продолжительности приложения. Компилятор не может оптимизировать внешний вид, потому что нет никакого способа узнать, что конкретный тип не будет меняться во время выполнения (даже если это был самый удивительный компилятор, он не может размышлять о поведении динамически загружаемого библиотеки). На JIT-компилированном языке, таком как Java или .NET, JIT может обнаруживать, что тот же тип используется снова и снова, и встроенное кэширование. Я в основном ищу способ сделать это вручную для конкретных указателей на С++.
Есть ли способ в С++ кэшировать этот поиск? Я понимаю, что решения могут быть довольно хаки. Я готов принять конкретные хаки ABI/компилятора, если можно написать тесты конфигурации, которые обнаруживают соответствующие аспекты ABI/компилятора, чтобы он "практически переносился", даже если он не был действительно портативным.
Обновление: для скептиков: если это не стоило оптимизировать, то я сомневаюсь, что современные JIT это сделают. Считаете ли вы, что инженеры Sun и MS тратили время на внедрение встроенного кеширования и не сравнивали его, чтобы обеспечить улучшение?