Встроенный и Виртуальный - PullRequest
       26

Встроенный и Виртуальный

1 голос
/ 11 апреля 2011

ребята. Я прочитал несколько веток о взаимодействии между встроенным и виртуальным сосуществованием в одной функции. В большинстве случаев компиляторы не считают его встроенным. Однако применяется ли этот принцип к сценарию, когда не виртуальная встроенная функция-член вызывает виртуальную функцию? говорят:

class ABC{
public:
    void callVirtual(){IAmVitrual();}
protected:
    virtual void IAmVirtual();
};

Ответы [ 4 ]

2 голосов
/ 11 апреля 2011

Весь смысл виртуальных функций в том, что компилятор обычно не знает, какая из реализаций производного класса понадобится во время выполнения, или даже если дополнительные производные классы будут динамически загружаться из разделяемых библиотек.Так что, в общем, встроить невозможно.Единственный случай, когда компилятор может встроить , - это когда он точно знает, с каким типом он имеет дело, потому что он может видеть конкретный тип в коде и вскоре после этого - без шансов на изменение типа -увидеть вызов виртуальной функции.Даже в этом случае не требуется , чтобы попытаться оптимизировать или встроить, это единственный случай, когда это даже возможно.

Вы не должны пытаться бороться с этим, если профилировщик не доказал виртуальные вызовыубивают тебяЗатем сначала попытайтесь сгруппировать несколько операций, чтобы один виртуальный вызов мог сделать больше за вас.Если виртуальная диспетчеризация все еще слишком медленная, подумайте о поддержании какого-то различающегося объединения: оно намного менее гибкое и чисто расширяемое, но может избежать издержек при вызове виртуальной функции и разрешить встраивание.

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

2 голосов
/ 11 апреля 2011

Какой принцип? Я ожидаю, что компилятор сгенерирует вызов виртуальной функции. Вызов (в действительности указатель перехода к функции) может быть встроенным, но функция IAmVirtual не является.

Сама виртуальная функция не является inline, и она не вызывается с квалификацией, необходимой для ее встраивания, даже если бы она была, поэтому она не может быть встроена.

0 голосов
/ 11 апреля 2011

Виртуальные функции нужно искать в таблице виртуальных методов, и в результате компилятор не может просто переместить их, чтобы они были встроенными.Обычно это поиск во время выполнения.Однако встроенная функция может вызывать виртуальную, и компилятор может поместить этот вызов (код для поиска вызова в VMT) встроенным.

0 голосов
/ 11 апреля 2011

В вашем случае callVirtual() будет встроено. Любая не виртуальная функция может быть хорошим кандидатом на inline (очевидно, последнее решение остается за компилятором).

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