реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Таблица виртуальных функций для AVR., WinAVR-20081205
kurtis
сообщение Apr 23 2009, 14:34
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Возник небольшой вопрос про таблицу виртуальных функций.
Насколько я понял, в таблице виртуальных функций содержаться указатели на функцию. Т.е. размер vtable будет зависеть от количества виртуальных функций в базовом классе. В связи с этим возникает небольшой вопрос.
Есть такой вот базовый класс
Код
        class BaseClass
        {
            public:
                // Перемещение по меню
                uint8_t getListValue(uint8_t Value,uint8_t MaxValue);
                const char * MenuName;      //Имя пункта меню
                BaseClass * returnItem;     //Указатель на меню возврата
                BaseClass ** forwardItem;   //Указатель на меню перехода

                virtual void showMenu() = 0;
                virtual void showMenuItems() = 0;
                virtual void checkPushButtons() = 0;

                BaseClass()
                : returnItem (0), forwardItem (0)
                {};
                virtual ~BaseClass() {};
        };
Т.е. имеется 3 виртуальных функции плюс деструктор, ожидаю что размер vtable будет около 8 байт (1 указатель - 2 байта, всего 4 функции), но в результате получаю такой вот результат (вывод команды "avr-nm -n -C --print-size Project.elf" )
Цитата
00800157 0000000e V vtable for Menu::EndItem
00800165 0000000e V vtable for Menu::InterItem
00800173 0000000e V vtable for Menu::GlobalItem
00800181 0000000e V vtable for Menu::BaseClass
EndItem, InterItem и GlobalItem наследуют BaseClass.
Размер vtable получился 0x0E - 14 байт, .т.е немного больше чем ожидалось. От куда взялись "лишние" байты?
Заранее спасибо!
Go to the top of the page
 
+Quote Post
XVR
сообщение Apr 24 2009, 07:10
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



В VTable кроме собственно указателей на виртуальные функции еще может содержаться разная дополнительная информация -
смещения this при множественном наследовании
ссылка на RTTI информацию (может присуствовать даже если RTTI не используется, например для поддержки exception)
и еще все, что угодно - как захочется компилятору

Сгенерите ассемблер из cpp и посмотрите, что компилятор сложил в VTable
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 19:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01373 секунд с 7
ELECTRONIX ©2004-2016