Когда V-таблица создается для класса?
Я знаю, что реализация разрешения вызовов виртуальных функций не является частью стандартов C++ и ничего не говорит о vptr или v-table, но позвольте мне задать этот вопрос здесь.
Я слышал, что v-таблица - это распространенный метод, используемый компиляторами для реализации разрешения вызовов виртуальных функций. Я понимаю, что для каждого класса и процесса требуется только виртуальная таблица.
Что мне интересно, так это когда v-таблица создается для класса?
Это когда класс заданного типа (которому нужна v-таблица) создается в пространстве процесса впервые?
Все другие впоследствии созданные объекты этого типа в этом пространстве процесса, ссылаются на V-таблицу, которая уже создана?
Когда эта таблица будет удалена?
Прошу прощения, если это слишком субъективный или дискуссионный вопрос, но эти вопросы задерживаются в моей памяти на некоторое время, и я чувствую, что это нормально, задавая их здесь.
4 ответа
V-таблица статически размещена и никогда не удаляется, а также не выделяется явно. Указатели в любом конкретном объекте являются константами.
C++ FAQ предоставляет упрощенное объяснение механизма vtable. Вы должны прочитать его, хотя вам, вероятно, придется более подробно изучить документацию вашего компилятора.
Самые важные идеи с моей точки зрения:
- Vtable для типа является статическим и создается во время компиляции
- Каждый из экземпляров типа содержит указатель на эту таблицу
- Поскольку этот указатель инициализируется во время конструирования, виртуальная функция-член никогда не должна вызываться из конструктора.
Vtable - это статические данные, которые сразу же доступны при загрузке. Кстати, он обычно входит в состав модуля компиляции, который содержит определение для первой не встроенной виртуальной функции в классе (и эта эвристика приводит к проблеме, когда существует только одна виртуальная функция, которая встроена).
Я считаю, что все зависит от реализации, поэтому сложно дать универсальный ответ на этот вопрос. Я считаю, что vtable должен быть своего рода статическим членом класса.