Virtual method performance
ZloyChert opened this issue · 3 comments
"Вызов виртуальных методов хоть и идет через таблицу VMT, но из-за того что индексы заранее известны, то по сути каждый вызов нагружается на единственное разыменовывание указателя. В 99,999% случаев это не повлияет вообще ни на что: проседание (если вообще можно так выразиться) будет настолько маленьким что им в принципе можно принебречь"
По сравнению с невиртуальными методами, проседание все же будет не таким незначительным, т.к. насколько я помню, при вызове невиртуальных методов нет необходимости в разыменовании указателя на таблицу методов, т.к. есть возможность вызвать метод напрямую.
Также виртуальный метод автоматически убирает возможность мощной оптимизации - встаивания метода, что логично, т.к. тип объекта становится известным только во время выполнения.
Также вызов виртуального метода сопровождается не одним разыменованием указателя. После разыменования указателя на таблицу методов, разыменовывается и список методов. То есть фактически экономия в 2 разыменования.
Тут тоже зависит от. Например, если класс - sealed, то тут практически гарантия того что вызваны будут конкретные методы и можно их вызвать напрямую. А при вызове по таблице имеем:
- адрес VMT - в регистр
- call по адресу, полученному при чтении по адресу "VMT+смещение" - это одна инструкция asm
MOV ECX, [EAX] // Get VMT pointer into ECX
CALL [ECX+0x014] // Virtual dispatch via VMT method slot
- Добавить
asm
пример для вызова через VMT