Можете ли вы кэшировать поиск виртуальных функций в C ++?

Скажем, у меня есть вызов виртуальной функции foo () для абстрактного указателя базового класса, mypointer-> foo (). Когда мое приложение запускается, основываясь на содержимом файла, оно решает создать экземпляр конкретного конкретного класса и назначает mypointer этому экземпляру. Для остальной части жизни приложения mypointer будетвсегда указывают на объекты этого конкретного типа. У меня нет способа узнать, что это за конкретный тип (он может быть создан на фабрике в динамически загружаемой библиотеке). Я только знаю, что тип останется прежним после первого создания экземпляра конкретного типа. Указатель не всегда может указывать на один и тот же объект, но объект всегда будет иметь один и тот же конкретный тип. Обратите внимание, что тип технически определяется во время выполнения, потому что он основан на содержимом файла, но после запуска (файл загружен) тип фиксируется.

Однако в C ++ я плачу за поиск виртуальных функций каждый раз, когда вызывается foo в течение всего времени работы приложения. Компилятор не может оптимизировать внешний вид, потому что у него нет возможности узнать, что конкретный тип не изменится во время выполнения (даже если это был самый удивительный компилятор за всю историю, он не может спекулировать на поведении динамически загружаемого библиотеки). В JIT-скомпилированном языке, таком как Java или .NET, JIT может обнаружить, что один и тот же тип используется снова и снова, и сделатьвстроенное кэширование, Я в основном ищу способ сделать это вручную для конкретных указателей в C ++.

Есть ли способ в C ++ для кэширования этого поиска? Я понимаю, что решения могут быть довольно хакерскими. Я готов принять взломы, специфичные для ABI / компилятора, если возможно написать тесты конфигурации, которые обнаруживают соответствующие аспекты ABI / компилятора, так что он «практически переносим», даже если он не является действительно переносимым.

Обновление: для скептиков: если бы это не стоило оптимизировать, то я сомневаюсь, что современные JIT сделают это. Как вы думаете, инженеры Sun и MS тратили свое время на внедрение встроенного кэширования и не тестировали его, чтобы убедиться в улучшении?

Ответы на вопрос(9)

Ваш ответ на вопрос