фсякая инитиресссная фсячина
Заполнение динамического массива именами файлов
Запись от deathNC размещена 15.02.2012 в 02:01
Mawrat: Подобную работу уже выполняет менеджер памяти Delphi. ![]() Но иногда, при обработке больших объёмов данных метод с приращением на 100 и более элементов ещё более оптимизирует работу. Например, если для массива выделена память на 1 000 000 элементов и этот массив уже заполнен, а требуется добавить ещё один элемент, то стоимость его добавления будет очень высокой. - Менеджер выделит блок памяти нужного размера под новый массив. Этот блок будет взят или из запасов Менеджера или будет запрошен у системы, если таких запасов уже не осталось. Потом произойдёт копирование элементов из прежнего массива в новый массив и плюс добавится новый элемент. Затем блок памяти, где был расположен прежний массив, Менеджер памяти заберёт в свой пул. И если потребуется, отдаст его полностью или частично системе. Итого, в этом случае, добавление нового элемента нам обошлось в 1 000 000 операций + накладные расходы на выделение/освобождение памяти. Это я всё к тому, чтобы показать, насколько ресурсоёмкой может оказаться операция добавления всего лишь одного элемента. ![]() ![]() --- Это же касается и длинных строк типа String, AnsiString, WideString. Они устроены также как одномерные динамические массивы. - Здесь надо учитывать, что операции Insert() и Delete() могут оказаться очень ресурсоёмкими. Поэтому при обработке больших текстов следует исключать Insert() и Delete() везде, где это возможно. Но здесь тоже до маразма доводить не надо - Менеджер памяти старается оптимизировать работу и со строками тоже. Тем не менее, бывают случаи, когда принципиально надо исключать все Insert() и Delete(). |
Всего комментариев 1
Комментарии
-
Можно было показать как мы можем помочь Менеджеру памяти, например, для популярного TList и его сородичей дженериков:
Delphi 1 2 3 4 5 6 7 8 9
// заполнение списка известным кол-вом элементов list.Capacity := n; // сразу выделяем место для будущих n эл-тов for i:=1 to n do list.Add( newElem ); // Очистка листа без перераспределения памяти // Метод Clear очищает список полностью, // но если нам ещё потребуется этот список, то можно сделать так: list.Count := 0;
Запись от snake32 размещена 08.11.2012 в 18:25