Когда V-таблица создается для класса?

Я знаю, что реализация разрешения вызовов виртуальных функций не является частью стандартов C++ и ничего не говорит о vptr или v-table, но позвольте мне задать этот вопрос здесь.

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

Что мне интересно, так это когда v-таблица создается для класса?
Это когда класс заданного типа (которому нужна v-таблица) создается в пространстве процесса впервые?
Все другие впоследствии созданные объекты этого типа в этом пространстве процесса, ссылаются на V-таблицу, которая уже создана?
Когда эта таблица будет удалена?

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

4 ответа

Решение

V-таблица статически размещена и никогда не удаляется, а также не выделяется явно. Указатели в любом конкретном объекте являются константами.

C++ FAQ предоставляет упрощенное объяснение механизма vtable. Вы должны прочитать его, хотя вам, вероятно, придется более подробно изучить документацию вашего компилятора.

Самые важные идеи с моей точки зрения:

  • Vtable для типа является статическим и создается во время компиляции
  • Каждый из экземпляров типа содержит указатель на эту таблицу
  • Поскольку этот указатель инициализируется во время конструирования, виртуальная функция-член никогда не должна вызываться из конструктора.

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

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

Другие вопросы по тегам