Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.47 MB
Время: 0.077 c
15-1161522130
PHPDeveloper
2006-10-22 17:02
2006.11.12
Кто сколько часов спит в день


2-1161769105
Aleks
2006-10-25 13:38
2006.11.12
Подскажите, как скопировать с Form1 изображение, нарисованное


1-1159719430
Master_
2006-10-01 20:17
2006.11.12
EXCEL документ в DLL ?


11-1137965443
Flea
2006-01-23 00:30
2006.11.12
Hottrack для TabControl


3-1158065644
NotGooDP
2006-09-12 16:54
2006.11.12
Информация о последней дате редактирования таблицы в MsSQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский