Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Расход памяти


jmi2k ©   (2006-10-26 17:26:00) 

Есть структура
 TMyItem = record
   FNameLength: Word;
   FName: string;
   FFlags1: Word;
   FFlags2: Word;
   FFlagsType: Word;
 end;
 
 TMyBigItem = record
   FInternalValue: Byte;
   FFeedBagItems: array of TMyItem;
   FNumber: DWord;      
 end;


И начинаю я в один момент заполнять структуру типа TMyBigItem, при этом расход памяти возрастает раза в три. Что такое?

И чем можно отследить поэтапное выделение памяти по каждой инструкции.


Sapersky   (2006-10-26 18:11:00) [1]

при изменении длины динамического массива, AFAIK, создается новый массив, и в него копируются данные из старого

В том случае если счётчик ссылок > 1, иначе этот вопрос отдается на откуп ReAllocMem, про которую в help'е сказано "If the block cannot be reallocated in place, it is moved to a new location in the heap, and P is updated accordingly", т.е. может быть in place (хотя не знаю насколько часто, не проверял).

2 jmi2k:
Перевыделять по одному элементу в любом случае не стоит. Лучше блоками по нескольку сразу. Например, для небольших объёмов - в 2 раза больше чем было, для больших - в 1.5, 1.25 и т.п. Можно "скопипастить" из TList.Grow. Можно просто использовать TList.


Anatoly Podgoretsky   (2006-10-26 17:57:00) [2]


> А каким образом организовать структуру с динамическим массивом
> структуры с динамическими строками, но с меньшим расходом
> памяти?

Написать свой диспетчер памяти


DrPass   (2006-10-26 17:54:00) [3]


> дефрагментации

я имел в виду фрагментации :) но все ведь поняли, что я имел, ага?


jmi2k   (2006-10-26 17:52:00) [4]


> Небось, вызываешь SetLength перед добавлением каждого нового
> элемента?
>

ага


DrPass   (2006-10-26 17:48:00) [5]


> Я ожидал что расход памяти увеличится ~пропорционально объему
> данных записанных в MyBigItem.

Нет. Во-первых, менеджер памяти забирает память "с запасом". Во-вторых, при изменении длины динамического массива, AFAIK, создается новый массив, и в него копируются данные из старого, а потом старый уничтожается. В-третьих, такие многократные перетурбации приводят к дефрагментации выделенной памяти и соответственно к неэффективному ее использованию. Небось, вызываешь SetLength перед добавлением каждого нового элемента?


jmi2k   (2006-10-26 17:46:00) [6]

А каким образом организовать структуру с динамическим массивом структуры с динамическими строками, но с меньшим расходом памяти?


Anatoly Podgoretsky   (2006-10-26 17:43:00) [7]


> Я ожидал что расход памяти увеличится ~пропорционально объему
> данных записанных в MyBigItem.

Для этого нет ни каких реальных оснований.


jmi2k   (2006-10-26 17:41:00) [8]

Какая разница сколько я ожидал. Я ожидал что расход памяти увеличится ~пропорционально объему данных записанных в MyBigItem.


Desdechado   (2006-10-26 17:40:00) [9]

Ну, если ты заполняешь структуру с динамичиским массивом, сожержащим динамические строки, то памыть может поедаться ровно столько, сколько твой аппетит и ограничения системы позволят.


Сергей М.   (2006-10-26 17:29:00) [10]


> раза в три. Что такое?
>


А ты, надо понимать. ожидал "раза в два" ...)


Наверх

Титульная страница Поиск, карта сайта Написать письмо