Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Таблица виртуальных функций для AVR.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
kurtis
Возник небольшой вопрос про таблицу виртуальных функций.
Насколько я понял, в таблице виртуальных функций содержаться указатели на функцию. Т.е. размер 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 байт, .т.е немного больше чем ожидалось. От куда взялись "лишние" байты?
Заранее спасибо!
XVR
В VTable кроме собственно указателей на виртуальные функции еще может содержаться разная дополнительная информация -
смещения this при множественном наследовании
ссылка на RTTI информацию (может присуствовать даже если RTTI не используется, например для поддержки exception)
и еще все, что угодно - как захочется компилятору

Сгенерите ассемблер из cpp и посмотрите, что компилятор сложил в VTable
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.