Форум: "Начинающим";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];
ВнизРасход памяти Найти похожие ветки
← →
jmi2k (2006-10-26 17:26) [0]Есть структура
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, при этом расход памяти возрастает раза в три. Что такое?
И чем можно отследить поэтапное выделение памяти по каждой инструкции.
← →
Сергей М. © (2006-10-26 17:29) [1]
> раза в три. Что такое?
>
А ты, надо понимать. ожидал "раза в два" ...)
← →
Desdechado © (2006-10-26 17:40) [2]Ну, если ты заполняешь структуру с динамичиским массивом, сожержащим динамические строки, то памыть может поедаться ровно столько, сколько твой аппетит и ограничения системы позволят.
← →
jmi2k (2006-10-26 17:41) [3]Какая разница сколько я ожидал. Я ожидал что расход памяти увеличится ~пропорционально объему данных записанных в MyBigItem.
← →
Anatoly Podgoretsky © (2006-10-26 17:43) [4]
> Я ожидал что расход памяти увеличится ~пропорционально объему
> данных записанных в MyBigItem.
Для этого нет ни каких реальных оснований.
← →
jmi2k (2006-10-26 17:46) [5]А каким образом организовать структуру с динамическим массивом структуры с динамическими строками, но с меньшим расходом памяти?
← →
DrPass © (2006-10-26 17:48) [6]
> Я ожидал что расход памяти увеличится ~пропорционально объему
> данных записанных в MyBigItem.
Нет. Во-первых, менеджер памяти забирает память "с запасом". Во-вторых, при изменении длины динамического массива, AFAIK, создается новый массив, и в него копируются данные из старого, а потом старый уничтожается. В-третьих, такие многократные перетурбации приводят к дефрагментации выделенной памяти и соответственно к неэффективному ее использованию. Небось, вызываешь SetLength перед добавлением каждого нового элемента?
← →
jmi2k (2006-10-26 17:52) [7]
> Небось, вызываешь SetLength перед добавлением каждого нового
> элемента?
>
ага
← →
DrPass © (2006-10-26 17:54) [8]
> дефрагментации
я имел в виду фрагментации :) но все ведь поняли, что я имел, ага?
← →
Anatoly Podgoretsky © (2006-10-26 17:57) [9]
> А каким образом организовать структуру с динамическим массивом
> структуры с динамическими строками, но с меньшим расходом
> памяти?
Написать свой диспетчер памяти
← →
Sapersky (2006-10-26 18:11) [10]при изменении длины динамического массива, 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.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.046 c