|
Таблица виртуальных методов
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petravадрес брали у метода предка. Уверен, что адрес берётся у предка?.. Синтаксически у предка. На практике, я думаю, вот тут: Код: plaintext 1.
Возвращается адрес прокси-функции заточенной на вызов virtualMethod(). ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2021, 23:17 |
|
Таблица виртуальных методов
|
|||
---|---|---|---|
#18+
petrav Да ладно только одна... А как же тогда работает вызов виртуальных методов, если в распоряжении у нас только адрес виртуального метода базового класса? Как правило, адресом виртуального метода является индекс указателя на метод в vtable. Соответственно, при вызове виртуального метода используется соответствующая классу таблица vtable и индекс метода. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2021, 11:34 |
|
Таблица виртуальных методов
|
|||
---|---|---|---|
#18+
rdb_dev petrav Да ладно только одна... А как же тогда работает вызов виртуальных методов, если в распоряжении у нас только адрес виртуального метода базового класса? Как правило, адресом виртуального метода является индекс указателя на метод в vtable. Соответственно, при вызове виртуального метода используется соответствующая классу таблица vtable и индекс метода. Я думал о таком варианте, но в случае Студии это явно не так. Было бы интересно узнать почему. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2021, 20:44 |
|
Таблица виртуальных методов
|
|||
---|---|---|---|
#18+
petrav, встаёт вопрос как проверить, что функция виртуальная перегружена ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2021, 17:46 |
|
Таблица виртуальных методов
|
|||
---|---|---|---|
#18+
petrav Я думал о таком варианте, но в случае Студии это явно не так. Было бы интересно узнать почему. Истоки этого в том что тип указателя не меняется от того виртуальная ф-я или нет, хотя вызываются они по разному. Это значит что вызывающий код должен в рантайме определить какой это указатель. В GCC в указателе есть флаг и происходит проверка этого флага и ветвление. В VS чтобы избежать ветвления хранят адрес прокси. Возможно какой-то из этих подходов лучше, но думаю что причина по которой подходы разные в том что когда-то было выбрано какое-то решение, но потом так просто сменить ABI уже не получилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2021, 11:02 |
|
Таблица виртуальных методов
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyВ GCC в указателе есть флаг и происходит проверка этого флага и ветвление. В VS чтобы избежать ветвления хранят адрес прокси. Вообще-то вывод выше из GCC, так что там, скорее всего, тоже прокси. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2021, 13:39 |
|
Таблица виртуальных методов
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Вообще-то вывод выше из GCC, так что там, скорее всего, тоже прокси. В вашем коде компилятор знает конкретные адреса функций каждого объекта потому что видит весь код. Я же говорил про чистый полиморфизм - когда есть только указатель на базовый класс и указатель на его метод который надо вызвать. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2021, 20:59 |
|
|
start [/forum/topic.php?fid=57&gotonew=1&tid=2017183]: |
0ms |
get settings: |
13ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
12ms |
get first new msg: |
9ms |
get forum data: |
3ms |
get page messages: |
193ms |
get tp. blocked users: |
2ms |
others: | 326ms |
total: | 627ms |
0 / 0 |