Оптимизация компилятора вызовов виртуальных функций - PullRequest
0 голосов
/ 12 июня 2018

Самый популярный пример, иллюстрирующий, почему виртуальная диспетчеризация происходит во время выполнения, - это когда невозможно определить во время компиляции, какой класс Derived будет создан.Например:

Base* b = (rand() % 2 == 1 ? new Derived1() : new Derived2());

или когда это зависит от пользовательского ввода.

Предположим, что это не так, и во время компиляции можно полностью определить, какой производный класс ссылается на базовый указательto.

Если во время компиляции известно, на какой производный класс указывает указатель базового класса, оптимизирует ли компилятор вызов виртуальной функции , заменяя его соответствующей производной функцией и не делая vtableпоиск во время выполнения?

1 Ответ

0 голосов
/ 12 июня 2018

Такая оптимизация называется девиртуализацией.По крайней мере, Clang выполняет это, см. это сообщение в блоге и это сообщение в списке рассылки .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...