Когда V-таблица создана для класса?
-
26-09-2019 - |
Вопрос
Я знаю, как реализовать разрешение вызова виртуальной функции не является частью Standrads C ++, ни это ничего не говорит о VPTR или V-таблице, но позвольте мне задать этот вопрос здесь.
Я слышал, что V-Table является общей техникой, используемой компиляторами для реализации разрешения вызова виртуальной функции. Мое понимание об этом заключается в том, что в процессе нужна только виртуальная таблица.
То, что мне интересно, когда V-таблица создана для класса?
Это когда класс данного типа (который нуждается в V-таблице), в первую очередь создается в пространстве процесса?
Все остальные впоследствии созданные объекты этого типа в этом процессном пространстве относится к V-таблицу, которая уже создана?
Когда этот V-таблице будет удалена?
Извините, если это слишком субъективно или обсуждает тип вопроса, но эти вопросы на некоторое время задерживаются, и я чувствую, что все в порядке, спрашивая это здесь.
Решение
V-таблица статически выделяется и никогда не удаляется, и не так явно выделяется. Указатели в любом конкретном конкретном объекте являются константы.
Другие советы
То C ++ FAQ Обеспечивает упрощенное объяснение механизма VTable. Вы должны прочитать, хотя вам, вероятно, придется пройти вашу конкретную документацию компилятора для более подробной информации.
Самые важные идеи с моей точки зрения:
- VTable для типа статичен и построен во время компиляции
- Каждый из экземпляров типа содержит указатель к этой таблице
- Поскольку этот указатель инициализируется по времени конструкции, функция виртуальной группы никогда не должна вызывать от конструктора
VTable - это статические данные, так доступны сразу при нагрузке. Кстати, он обычно входит в устройство компиляции, который содержит определение для первой ненастроенной виртуальной функции на классе (и что эвристики приводит к проблеме, когда есть только одна виртуальная функция, которая встроена).
Я верю, что все это определено реализация, поэтому сложно дать универсальный ответ на этот вопрос. Я считаю, что VTable должен быть какой-то элементом статического класса.