В каком сегменте программы находится таблица виртуальных функций класса?

148
24 июня 2021, 02:30

Имеется одиночный класс с одной виртуальной функцией, не чисто-виртуальной.

Будет ли создана таблица виртуальных функций для этого класса, если класс объявлен, но нигде в программе не создается объектов этого класса?

В каком сегменте программы располагается таблица виртуальных функций класса?

Вопросы с собеседования по С++

Answer 1

Расположение vtable и vpointer зависит от реализации компилятора. Дальше глубже в ELF будет одна структура а на win32 другая. Для gcc можно покопаться в -fdump-class-hierarchy

"-fdump-class-hierarchy-options (C++ only) Dump a representation of each class's hierarchy and virtual function table layout to a file. The file name is made by appending .class to the source file name, and the file is created in the same directory as the output file. If the `-options' form is used, options controls the details of the dump as described for the -fdump-tree options. "

взято с http://gcc.gnu.org/onlinedocs/gcc-4.6.0/gcc/Debugging-Options.html

Answer 2

Будет ли создана таблица виртуальных функций для этого класса, если класс объявлен, но нигде в программе не создается объектов этого класса?

Это вопрос качества реализации. Может будет, а может не будет. На такие вопросы можно отвечать лишь в привязке к конкретной реализации, конкретной версии этой реализации и даже конкретных ее настроек.

С точки же зрения языка С++, никакой "таблицы виртуальных функций" не существует вообще.

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

Насколько я помню, популярным подходом (GCC?) является на стадии компиляции помещать таблицу виртуальных функций в тот объектный файл, в котором располагается определение первого (в порядке объявления) не-pure виртуального метода класса.

В каком сегменте программы располагается таблица виртуальных функций класса?

В сегменте инициализированных данных.

READ ALSO
Как работает оператор [] в std::shared_ptr

Как работает оператор [] в std::shared_ptr

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

93
noexcept swap с мьютексами

noexcept swap с мьютексами

Считается хорошим тоном обеспечивать noexcept-swap функцию-член классаЧто делать, если появляется необходимость добавить в этой функции такую...

127
Проверка блокировки MAC OS

Проверка блокировки MAC OS

Как проверить заблокирована ли машина на MAC OS?

96
Как создать программно папку на системном диске в Qt?

Как создать программно папку на системном диске в Qt?

У меня есть часть кода, в которой должна создаваться папка на диске С:

199