Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2018, 21:34   #1
Yudin
Пользователь
 
Регистрация: 11.01.2018
Сообщений: 49
Сообщение Сколько памяти занимает VMT?

Здравствуйте, искал информацию про то, сколько памяти занимает таблица виртуальных методов и наткнулся на такую фразу:"...размер объекта складывается из размера полей + (размер указателя) * (количество указателей на таблицы виртуальных функций если они есть) + может быть добавлено выравнивание.".

Я не понимаю, как можно добиться того, чтобы в одном объекте было несколько таблиц виртуальных методов. Я пробовал создать абстрактный класс и создать его класс-наследник, в котором я объявил независимый от родителя виртуальный метод. Ожидал увидеть, что класс-наследник будет занимать больше памяти, чем абстрактный, потому что в моём понимании создалось 2 vmt (одна от родителя, вторая в самом классе). Экспериментировал по-разному, создавал иерархию, желаемого результата не получил, все классы и их объекты (динамически объекты не создавал) весили одинаково.

Как же можно убедиться в этом: "... + (размер указателя) * (количество указателей на таблицы виртуальных функций если они есть)..."
Может я неправильно понял принцип? Подскажите, пожалуйста.
Yudin вне форума Ответить с цитированием
Старый 03.10.2018, 22:56   #2
nimazzzy
Новичок
Джуниор
 
Регистрация: 21.04.2017
Сообщений: 2
По умолчанию

Это, конечно, все compiler-dependent. Но в общем случае:
Цитата:
Сообщение от Yudin Посмотреть сообщение
в моём понимании создалось 2 vmt (одна от родителя, вторая в самом классе)
Зачем? В начале экземпляра класса-наследника лежит указатель на массив, в котором находятся адреса методов.
nimazzzy вне форума Ответить с цитированием
Старый 04.10.2018, 00:24   #3
Yudin
Пользователь
 
Регистрация: 11.01.2018
Сообщений: 49
По умолчанию

Цитата:
Сообщение от nimazzzy Посмотреть сообщение
Зачем? В начале экземпляра класса-наследника лежит указатель на массив, в котором находятся адреса методов.
То есть при создании экземпляра класса-наследника, в нём создаётся одна таблица виртуальных методов с виртуальными функциями родителя и своими виртуальными функциями? Тогда я вообще не представляю как в объекте может быть несколько указателей на vmt...
Yudin вне форума Ответить с цитированием
Старый 04.10.2018, 00:46   #4
nimazzzy
Новичок
Джуниор
 
Регистрация: 21.04.2017
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Yudin Посмотреть сообщение
То есть при создании экземпляра класса-наследника, в нём создаётся одна таблица виртуальных методов с виртуальными функциями родителя и своими виртуальными функциями?
Да. Зачем несколько таблиц создавать? Базовый класс в курсе по каким смещениям его методы. Они в начале, никуда не денутся, хоть у базы, хоть у наследника. А наследник тоже сам в курсе, от кого он унаследовался и по каким смещениям его указатели будут находиться, учитывая, что там еще указатели на методы базового класса (в начале, как вариант). Но это все один массив указателей - одна таблица.
Цитата:
Сообщение от Yudin Посмотреть сообщение
Тогда я вообще не представляю как в объекте может быть несколько у
казателей на vmt...
Множественное наследование, например.

Последний раз редактировалось nimazzzy; 04.10.2018 в 00:50.
nimazzzy вне форума Ответить с цитированием
Старый 04.10.2018, 20:03   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Цитата:
Сообщение от Yudin Посмотреть сообщение
"...размер объекта складывается из размера полей + (размер указателя) * (количество указателей на таблицы виртуальных функций если они есть) + может быть добавлено выравнивание.".
Мне кажется, что вы путаете понятия ссылки на VMT в объекте с размером самой VMT. В теле объекта обычно хранится лишь ссылка на VMT, занимающая sizeof intptr_t байт.

Сама VMT хранится где-то отдельно в сегменте кода, довольно часто VMT укладывают друг за другом в начале секции .text модуля PE (видно при визуальном просмотре). Как уже говорили, это внутренняя кухня компилятора, всё зависит от него.

Типовая VMT чаще всего состоит из полей InstanceSize, AncestorVMTPtr, затем идут ссылки на сами методы, то есть ее размер вычисляется по формуле:
Код:
sizeof size_t + sizeof intptr_t * (method_count + 1)
Про множественные VMT не скажу, нужно смотреть дизассемблированный код, сгенерированный конкретным компилятором. Мне как-то пока не приходилось, честно.
Vapaamies вне форума Ответить с цитированием
Старый 04.10.2018, 20:34   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Про множественные VMT не скажу
Для каждого родительского класса есть свой VMT плюс один для класса-наследника.
Там еще веселуха начинается со сдвигами this указателя, ибо каждый класс думает, что он единственный
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Assembler] Matrix rd H*W*4 ; выделение памяти под матрицу (строки идут друг за другом) rd - это сколько памяти выделяется? Дмитрийййй Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 10.10.2018 12:13
узнать, сколько памяти занимает класс BLACK_RAIN Общие вопросы Delphi 5 03.07.2017 15:15
webbrowser при обновлении страницы занимает больше оперативной памяти КатяСаша Общие вопросы Delphi 10 01.11.2016 18:44
Определить, сколько места занимает программа в памяти kolian87 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 26.01.2015 07:47
Количество оперативной памяти которое занимает программа werser Помощь студентам 1 03.02.2008 02:22