Сдравствуйте, я столкнулся с проблемой избыточного выделения памяти в 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 байта), но на практике выделяется в разы больще.
Здравствуйте, 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>>