Выделение памяти.Избыточное выделение
От: gz_  
Дата: 30.05.08 09:49
Оценка:
Сдравствуйте, я столкнулся с проблемой избыточного выделения памяти в WinXP.
Суть в том что при выделении памяти под массив объектов выделенная память (если верить диспетчеру) превышает расчетное раза в 2-3 т.е. при расчетном выделении около 40 мБ сжирается порядка 120 мБ.

Плзз не отвечайте типа память гдето потекла, код простой это исключено.

Код имеет вид:

//------------------------------------

Boo **objMass = new Boo *[COUNT];

for(int i = 0; i<COUNT; i++)
{
. . .
objMass[i] = new Boo(*params*);
}

//-------------------------------------

sizeof(Boo) выдает 16 байт

внутри класса производится выделение памяти под масив чаров(строку), остальные переменные стандартных типов unsigned char, int...

расчетный размер выделения примерно 16 + длина строки + 1 (+ возможно размеры указателей по 4 байта), но на практике выделяется в разы больще.
выделение памяти избыток помощь
Re: Выделение памяти.Избыточное выделение
От: Ovl Россия  
Дата: 30.05.08 09:57
Оценка:
Здравствуйте, gz_, Вы писали:

gz_>Сдравствуйте, я столкнулся с проблемой избыточного выделения памяти в WinXP.

gz_>Суть в том что при выделении памяти под массив объектов выделенная память (если верить диспетчеру) превышает расчетное раза в 2-3 т.е. при расчетном выделении около 40 мБ сжирается порядка 120 мБ.

при освобождении память возвращается? Если да, то с выделением все в порядке

gz_>Плзз не отвечайте типа память гдето потекла, код простой это исключено.


ты же про выделение говоришь, а не про освобождение

gz_>внутри класса производится выделение памяти под масив чаров(строку), остальные переменные стандартных типов unsigned char, int...

gz_>расчетный размер выделения примерно 16 + длина строки + 1 (+ возможно размеры указателей по 4 байта), но на практике выделяется в разы больще.

а дефрагментация памяти учитывается? или winxp уже все круто выделяет? помниться 98-я страдала дефрагментацией при выделении маленьких объектов.
Может попробовать свой менеджер памяти?
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re: Выделение памяти.Избыточное выделение
От: 8bit  
Дата: 30.05.08 11:08
Оценка:
В чем вообще вопрос?
Re: Выделение памяти.Избыточное выделение
От: Кодт Россия  
Дата: 30.05.08 12:10
Оценка:
Здравствуйте, gz_, Вы писали:

gz_>sizeof(Boo) выдает 16 байт

gz_>внутри класса производится выделение памяти под масив чаров(строку), остальные переменные стандартных типов unsigned char, int...
gz_>расчетный размер выделения примерно 16 + длина строки + 1 (+ возможно размеры указателей по 4 байта), но на практике выделяется в разы больще.

А ты про служебные данные у каждого выделенного тебе блока не забыл?
То, что тебе возвращает менеджер памяти из функции malloc или выражения new / new[], — это видимая часть блока.
А перед ней есть ещё невидимая, там указатели на смежные блоки, размер блока, размер и количество элементов (если у типа элемента есть нетривиальный деструктор).

Далее, если строка имеет длину 1 чар (концевой ноль), то под неё всё равно будет выделен блок минимального размера — 16 байт (8 байт служебных, 1 содержательный и 7 мусорных).

Вот и набегает...
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.