Необходимо в памяти хранить большое количесво элементов,каждый из которых не велик(300байт) но их может быть 100 а может и 10000.Программа генерирует элемент и кладет его в память.Проблема в том,что программа не знает заранее сколько элементов она насчитает поэтому надо при нехватке памяти добавлять страницы.Мой алгоритм такой: 1.Выделяю страницу(VirtualAlloc) 2.Начинаю добавлять элементы,каждый раз проверяя не происходит ли переполнение. 3.Если переполнение произошло создаю еще одну страницу и т.д Мне непонятно вот что:когда мы вызываем VirtualAlloc и в качестве первого параметра даем 0 то система разместит страницу по своему усмотрению и вернет базовый адрес.Когда я хочу создать еще одну страницу то я о5 передаю 0,и получаю еще один базовый адрес.При выделении нескольких страниц у меня есть несколько базовых адресов которые я допустим сохрнаю в массиве и затем буду использовать для вычисления линейного адреса,но это не удобно и неэффективно.Можно ли каким либо образом создавать страницы так,чтоб они следовали одна за другой?Я пробывал при создании второй страницы в качестве первого параметра VirtualAlloc указать адрес байта,который идет после первой страницы однако система возвращает ошибку.А если создавать страницы указывая 0 то они не следуют одна за другой.
А в чем оптимизация заключается? Не отъедать слишком много физической памяти? Тогда можно отъесть достаточно много виртуальной, а по мере необходимости делать выделанной памяти COMMIT.
Базовый адрес получаешь VirtualAlloc с флагом MEM_RESERVE и большим размером блока памяти - реальная память при этом не расходуется - только резервируется диапазон адресов, чтобы апи в него не залазили. А затем VirtualAlloc с флагом MEM_COMMIT и адресом уже тобой заданным в этом диапазоне обеспечит то расположение страниц которе нужно. http://www.wasm.ru/forum/viewtopic.php?pid=167377#p167377 http://www.wasm.ru/forum/viewtopic.php?pid=270546#p270546