2012-04-30 4 views
2

Я попытался найти, где именно таблица виртуальных функций хранится для класса C++. Я нашел несколько ответов, таких как его «статический массив указателей на функции» , так что он будет храниться в памяти только для чтения данных? (инициализированный)Где хранится таблица виртуальных функций для класса C++?

+7

Реализация определена. Стандарт даже не требует наличия каких-либо vtable _at all_, компиляторы могли бы реализовать виртуальное наследование другими способами, если бы обнаружили, что это возможно. – leftaroundabout

ответ

2

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

A vftable по одному на класс и хранится только в одном месте в памяти.

+0

Каковы другие способы использования компилятором для достижения полиморфизма времени выполнения? – saumitra

+0

@saumitra не эффективен, но каждый экземпляр 'мог' иметь набор указателей на методы. –

+0

«Только одно место в памяти» является общим, но, конечно, не универсальным. С DLL вы можете получить несколько копий. Надеемся, что идентичные, но нарушения ODR и их Неопределенное поведение могут сильно нарушить это. – MSalters

1

Когда вы производите любую виртуальную функцию, компилятор будет вставлять vptr внутри вашего класса. В результате размер класса будет расти на 4 байта (на Win32). Этот указатель содержит адрес виртуальной таблицы (vtable). vtable создается компилятором во время компиляции и в основном представляет собой массив указателей на функции. Указатели функций фактически указывают на виртуальные функции этого конкретного класса. Точнее, виртуальная таблица представляет собой статический массив указателей на функции, поэтому разные экземпляры одного и того же класса могут совместно использовать эту таблицу. Поскольку статические члены хранятся в разделе данных (.data), vtable также сохраняется в разделе данных исполняемого файла.

0

Это зависит от реализации, да.

И для g ++ (4.9.0) виртуальная таблица (а не указатель) сохраняется в разделе .rodata файла ELF и соответствующем сегменте LOAD в памяти.

Смежные вопросы