Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

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

#cpp


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

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

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

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


Ответы

Ответ 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

Ответ 2



Будет ли создана таблица виртуальных функций для этого класса, если класс объявлен, но нигде в программе не создается объектов этого класса? Это вопрос качества реализации. Может будет, а может не будет. На такие вопросы можно отвечать лишь в привязке к конкретной реализации, конкретной версии этой реализации и даже конкретных ее настроек. С точки же зрения языка С++, никакой "таблицы виртуальных функций" не существует вообще. Так как методы нелокального класса имеют внешнее связывание, таблица виртуальных функций скорее всего будет создана компилятором, т.к. в традиционной реализации на стадии компиляции компилятор не может знать, нужна эта таблица или нет. А вот на стадии сборки финального выполняемого модуля линкер уже имеет возможность выбросить ненужную таблицу виртуальных функций. Насколько я помню, популярным подходом (GCC?) является на стадии компиляции помещать таблицу виртуальных функций в тот объектный файл, в котором располагается определение первого (в порядке объявления) не-pure виртуального метода класса. В каком сегменте программы располагается таблица виртуальных функций класса? В сегменте инициализированных данных.

Комментариев нет:

Отправить комментарий