![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Расход памяти
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]
> раза в три. Что такое?
>
А ты, надо понимать. ожидал "раза в два" ...)