Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top