![]() |
|
Модераторы: bsa |
![]()
|
|
| grokk |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 13.5.2008 Репутация: нет Всего: нет |
Был недавно на интервью на должность QA. Там был задано несколько вопросов на которые я затруднился ответить
Если у вас есть неограниченая виртуальная память сколько максимум динамической памяти вы можете выделить с помощью new? Также буду очень благодарен если кто-нибудь поможет найти информацию по принципу работы virtual table и вобще про работу с памятью в С++(где хранятся переменные,указатели ,сколько места занимает и тд) Заранее спасибо за помощь |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 2 Всего: 67 |
про vtables обычно пишут в книжках про ком
-------------------- СУВ, Partizan. |
|||
|
||||
| rrrFer |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: 0 Всего: 1 |
если память выделяется под одну переменную, то ровно столько, сколько есть оперативной памяти. если выделяем под процесс, - то столько, сколько есть оперативной памяти+размер файла подкачки, потому что часть адресов выгружается в этот файл, но если переменная одна, то ясно что полпеременной выгрузить нельзя. если виртуальная память неограничена, то все равно существуют ограничения операционной системы для памяти выделяемой под процесс. Мне не удавалось выделить более 2.4 Гб под свою программу, хотя файл подкачки позволял |
|||
|
||||
| grokk |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 13.5.2008 Репутация: нет Всего: нет |
а чтото в сети почитать кто-нибудь может посоветовать? |
|||
|
||||
| bsa |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Принцип простой. У каждого класса, в котором есть виртуальные методы или который является наследником хоть одного класса с виртуальными методами, есть эта таблица. Она содержит указатели на виртуальные методы всех классов от текущего, до дальнего предка. Каждый новый виртуальный метод класса потомка увеличивает эту таблицу на 1 запись. Итак, когда выделяется память под класс, то размер таблицы виртуальных методов уже известен, затем следует вход в конструктор самого дальнего предка, он заполняет известную часть таблицы своими методами (это происходит до входа в тело конструктора, если он задан), затем тоже самое происходит поочередно со всеми классами в цепочке наследования, причем потомки могут менять уже существующие указатели на методы классов-предков на свои... Когда надо вызвать такой метод, то программа берет его адрес из таблицы... Деструкторы вызываются в обратном порядке. Перед входом в свое тело они делают тоже самое, что и перед входом в конструктор (тоже самое, а не обратное), что позволяет вызывать виртуальные методы из них не опасаясь вызвать метод потомка, деструктор которого уже отработал. В случае с виртуальным наследованием я рассказывать не буду, так как сам немного плаваю в этом вопросе. |
||||||
|
|||||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 2 Всего: 207 |
ты хотел сказать под объект класса? таблицу он не заполняет таблица уже сформирована изменяется адрес таблицы для объекта -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
именно объект. это я так, думал уже о другом А по поводу подмены таблицы - логично, и как я сам не догадался? |
|||
|
||||
| grokk |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 13.5.2008 Репутация: нет Всего: нет |
тоесть сама таблица содержится в классе и в ней сразу прописаны все вирутальные методы всех классов? и когда я создаю новый объект то он для каждого обьекта меняет адресс таблицы?
то есть для нескольких обьектов будет несколько таблиц? |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
таблица - одна, для всех объектов одного класса, каждый экземпляр содержит указатель на таблицу виртуальных функций своего класса...
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
grokk, точнее так, для каждого класса создается своя таблица на этапе компиляции. Каждый объект класса содержит указатель на данную таблицу. Перед входом в тело конструктора/деструктора значение этого указателя заменяется на адрес таблицы объекта класса, инициализируемого в данный момент.
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |