Когда V-таблица создается для класса? - PullRequest
4 голосов
/ 21 ноября 2010

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 21 ноября 2010

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

4 голосов
/ 21 ноября 2010

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

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

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

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

0 голосов
/ 21 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...