Компилятор и v-таблица

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

Теперь мой вопрос: где хранится эта v-таблица? Это в сегменте кода? Откуда выделяется память для этих таблиц. Поделитесь внутренней информацией.

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


person paper.plane    schedule 29.01.2018    source источник
comment
Как мы можем поделиться внутренней информацией, если вы не указали компилятор? Это все детали реализации. Я предоставлю вам популярный, но все еще зависящий от компилятора и не требуемый только языком.   -  person StoryTeller - Unslander Monica    schedule 29.01.2018
comment
... это слишком широко?   -  person user202729    schedule 29.01.2018
comment
Компилятор john (тот, что существует у меня в голове) хранит vtable в сегменте данных (в конце концов, это данные) и распределяет память статически (в конце концов, она фиксируется во время компиляции).   -  person john    schedule 29.01.2018
comment
@StoryTeller Я уже упоминал в своем вопросе, что можно указать любое имя компилятора и соответствующую реализацию.   -  person paper.plane    schedule 29.01.2018
comment
Делая ваш вопрос слишком широким, как указал пользователь 202729.   -  person StoryTeller - Unslander Monica    schedule 29.01.2018
comment
@StoryTeller, будет ли хорошо, если я попрошу GCC? Я этого не сделал, потому что кто-то, знающий о каком-то другом компиляторе, может в этом случае пропустить ответ.   -  person paper.plane    schedule 29.01.2018
comment
Если вы хотите обсудить методы реализации компилятора, Stack Overflow — неподходящее место. Это слишком широко для формата, не более того.   -  person StoryTeller - Unslander Monica    schedule 29.01.2018
comment
Возможный дубликат Где в памяти хранится vtable?   -  person user7860670    schedule 29.01.2018
comment
@VTT Верно, это своего рода дубликат, но никто не ответил о vtable в этом вопросе. Все говорили о vptr   -  person paper.plane    schedule 29.01.2018
comment
Почему бы просто не создать игрушечный проект в компиляторах, которые вам нужны и к которым у вас есть доступ, и посмотреть? Вы можете проверить таблицы символов и/или декомпилировать код нового выражения, чтобы выяснить это.   -  person Useless    schedule 29.01.2018
comment
^^^ то, что говорит @Useless, не бесполезно :) Разработайте и соберите какой-нибудь простой проект, посмотрите на сборку. Вы можете запустить его и пройти через отладчик, чтобы увидеть, как vptr, vtables и вызовы методов работают с наследованием, абстрактными и переопределяющими методами и т. д. Гораздо поучительнее, чем догадки :)   -  person Martin James    schedule 29.01.2018
comment
Как правило, они хранятся как некие данные только для чтения.   -  person curiousguy    schedule 05.02.2018


Ответы (1)


Действительно, это зависит от компилятора и платформы. GCC в Linux помещает их в .rodata сегмент файла ELF. Visual C++ помещает их в .rdata сегмент файла EXE/DLL.

В обоих случаях память нигде не выделяется, она отображается из исполняемого файла, как и код.

person Soonts    schedule 29.01.2018