Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.12;
Скачать: CL | DM;

Вниз

Расход памяти   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.036 c
2-1161943090
markers
2006-10-27 13:58
2006.11.12
Как проверить существования объекта?


2-1162045706
M1sT
2006-10-28 18:28
2006.11.12
Работа с ячейкой StringGrid


15-1161927720
clickmaker
2006-10-27 09:42
2006.11.12
Пятничные загадки


9-1138616293
Yanis
2006-01-30 13:18
2006.11.12
Почему этот код вызывает ошибку


15-1161339758
Jeer
2006-10-20 14:22
2006.11.12
С днем связи, связисты ! :)