| Цитата(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 запись. Итак, когда выделяется память под класс, то размер таблицы виртуальных методов уже известен, затем следует вход в конструктор самого дальнего предка, он заполняет известную часть таблицы своими методами (это происходит до входа в тело конструктора, если он задан), затем тоже самое происходит поочередно со всеми классами в цепочке наследования, причем потомки могут менять уже существующие указатели на методы классов-предков на свои... Когда надо вызвать такой метод, то программа берет его адрес из таблицы... Деструкторы вызываются в обратном порядке. Перед входом в свое тело они делают тоже самое, что и перед входом в конструктор (тоже самое, а не обратное), что позволяет вызывать виртуальные методы из них не опасаясь вызвать метод потомка, деструктор которого уже отработал. В случае с виртуальным наследованием я рассказывать не буду, так как сам немного плаваю в этом вопросе. |