Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Работа с памятю в С++


Автор: grokk 23.6.2008, 19:43
Был недавно на интервью на должность QA. Там был задано несколько вопросов на которые я затруднился ответить
Если у вас есть неограниченая виртуальная память сколько максимум динамической памяти вы можете выделить с помощью new?
Также буду очень благодарен если кто-нибудь поможет найти информацию по принципу работы virtual table и вобще про работу с памятью в С++(где хранятся переменные,указатели ,сколько места занимает и тд)
Заранее спасибо за помощь

Автор: Partizan 23.6.2008, 19:45
про vtables обычно пишут в книжках про ком

Автор: rrrFer 23.6.2008, 19:49
Цитата(grokk @  23.6.2008,  19:43 Найти цитируемый пост)
Если у вас есть неограниченая виртуальная память сколько максимум динамической памяти вы можете выделить с помощью new?

если память выделяется под одну переменную, то ровно столько, сколько есть оперативной памяти.
если выделяем под процесс, - то столько, сколько есть оперативной памяти+размер файла подкачки, потому что часть адресов выгружается в этот файл, но если переменная одна, то ясно что полпеременной выгрузить нельзя.
если виртуальная память неограничена, то все равно существуют ограничения операционной системы для памяти выделяемой под процесс. Мне не удавалось выделить более 2.4 Гб под свою программу, хотя файл подкачки позволял

Автор: grokk 23.6.2008, 20:33
Цитата(Partizan @ 23.6.2008,  19:45)
про vtables обычно пишут в книжках про ком

а чтото в сети почитать кто-нибудь может посоветовать?

Автор: bsa 23.6.2008, 20:33
Цитата(grokk @ 23.6.2008,  19:43)
Если у вас есть неограниченая виртуальная память сколько максимум динамической памяти вы можете выделить с помощью new?
Оператор new определен как:
Код
void *operator new(size_t size);
Отсюда следует, что памяти может быть выделено не более, чем число, которое помещается в переменную типа size_t (скорее всего, это будет не более NEW_ALLOC_MAX = 1<<(8*sizeof(size_t)) - 1).
Цитата(grokk @ 23.6.2008,  19:43)
Также буду очень благодарен если кто-нибудь поможет найти информацию по принципу работы virtual table и вобще про работу с памятью в С++(где хранятся переменные,указатели ,сколько места занимает и тд)

Принцип простой. У каждого класса, в котором есть виртуальные методы или который является наследником хоть одного класса с виртуальными методами, есть эта таблица. Она содержит указатели на виртуальные методы всех классов от текущего, до дальнего предка. Каждый новый виртуальный метод класса потомка увеличивает эту таблицу на 1 запись. Итак, когда выделяется память под класс, то размер таблицы виртуальных методов уже известен, затем следует вход в конструктор самого дальнего предка, он заполняет известную часть таблицы своими методами (это происходит до входа в тело конструктора, если он задан), затем тоже самое происходит поочередно со всеми классами в цепочке наследования, причем потомки могут менять уже существующие указатели на методы классов-предков на свои... Когда надо вызвать такой метод, то программа берет его адрес из таблицы... Деструкторы вызываются в обратном порядке. Перед входом в свое тело они делают тоже самое, что и перед входом в конструктор (тоже самое, а не обратное), что позволяет вызывать виртуальные методы из них не опасаясь вызвать метод потомка, деструктор которого уже отработал.
В случае с виртуальным наследованием я рассказывать не буду, так как сам немного плаваю в этом вопросе.

Автор: MAKCim 23.6.2008, 20:59
Цитата(bsa @  23.6.2008,  20:33 Найти цитируемый пост)
Итак, когда выделяется память под класс

ты хотел сказать под объект класса?  smile 

Цитата(bsa @  23.6.2008,  20:33 Найти цитируемый пост)
он заполняет известную часть таблицы своими методами 

таблицу он не заполняет
таблица уже сформирована
изменяется адрес таблицы для объекта

Автор: bsa 23.6.2008, 21:30
Цитата(MAKCim @ 23.6.2008,  20:59)
ты хотел сказать под объект класса?  smile 

таблицу он не заполняет
таблица уже сформирована
изменяется адрес таблицы для объекта

именно объект. это я так, думал уже о другом  smile 
А по поводу подмены таблицы - логично, и как я сам не догадался? smile

Автор: grokk 24.6.2008, 07:27
тоесть сама таблица содержится в классе и в ней сразу прописаны все вирутальные методы всех классов? и когда я создаю новый объект то он для каждого обьекта меняет адресс таблицы? 
то есть для нескольких обьектов будет несколько таблиц?

Автор: Lazin 24.6.2008, 08:02
таблица - одна, для всех объектов одного класса, каждый экземпляр содержит указатель на таблицу виртуальных функций своего класса...

Автор: bsa 24.6.2008, 10:22
grokk, точнее так, для каждого класса создается своя таблица на этапе компиляции. Каждый объект класса содержит указатель на данную таблицу. Перед входом в тело конструктора/деструктора значение этого указателя заменяется на адрес таблицы объекта класса, инициализируемого в данный момент.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)