c ++: содержит ли vtable указатели на не виртуальные функции?

vtable содержит указатели на виртуальные функции этого класса. Содержит ли он также указатели на не виртуальные функции?

Спасибо!

8

Решение

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

Когда не виртуальная функция называется реализацией должен используйте статический тип объекта, для которого вызывается функция, чтобы определить правильную функцию для вызова. Функция хранится в виртуальные таблицы доступ к vptr будет зависеть от динамического типа объекта, а не от какого-либо статического типа ссылки или указателя, через которые к нему осуществляется доступ.

9

Другие решения

Нет, это не так.

Поскольку вызовы не виртуальных методов могут быть разрешены во время компиляции (поскольку компилятор знает адреса не виртуальных функций), компилятор генерирует инструкции для их вызова «напрямую» (то есть статически).

Нет причин проходить через механизм косвенного обращения vtable для методов, которые известны во время компиляции.

4

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

То, отображаются ли не виртуальные функции в этой таблице, также не определено стандартом. В конце концов, стандарт даже не требует наличия vtable. Обычно, не виртуальные функции не находятся в таблице виртуальных функций, так как любые необходимые настройки указателя и вызов могут быть разрешены во время компиляции или соединения. Я мог бы представить реализацию, которая бы одинаково обрабатывала все функции и, таким образом, во всех случаях использовала указатель в таблице виртуальных функций. Я бы не стал очень популярен. Тем не менее, это может быть хорошим способом реализации C ++ в среде, где он беспрепятственно взаимодействует с более гибкой объектной системой, например, с языками, где отдельные функции могут быть заменены во время выполнения (я понимаю, что нечто подобное возможно, например, в питоне).

2

Нет. Vtable содержит только указатели на виртуальные функции в том же классе или файле.

0
По вопросам рекламы [email protected]