Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Размещение динамических переменных




Статические и динамические переменные

 

Во всех примерах, которые рассматривались выше, использовались статические переменные. Они размещаются в локальной памяти программы, которая называется стеком.

 

Новый термин: Локальные переменные размещаются в блоке памяти, который называется стеком программы. Локальные переменные называют статическими.

 

В любой момент когда программе требуется разместить переменную в памяти, используется стек. Как только необходимость в переменной отпадает, память освобождается. Обычно так происходит при входе в подпрограмму или в любой другой локальный блок кода. При выходе из подпрограммы память освобождается. Все это делается автоматически.

Размещение статических переменных в стеке имеет как преимущества, так и недостатки. С одной стороны, выделение памяти происходит максимально быстро. С другой стороны, стек имеет фиксированный размер; изменить его объем во время выполнения программы нельзя. Если в какой–то момент программа исчерпает резервы стека, ее поведение станет непредсказуемым. Она может зависнуть или закончиться аварийно. На 32-битных компьютерах такие ситуации возникают реже чем на 16-битных, но все же проблеме переполнения стека следует уделить внимание.

Если в программе используются переменные предопределенных типов или небольшие массивы, то можно обойтись статическими переменными. Но если необходима обработка записей большого размера, то лучше воспользоваться динамическими переменными. Динамические переменные размещаются в области памяти, которая называется кучей. Объем кучи определяется свободным объемом оперативной памяти и объемом свободного места на жестком диске. Стандартная настройка Windows поддерживает размер кучи 100MB. Таким образом, программе может быть доступен практически неограниченный объем памяти. (Сведение различных уровней памяти – оперативной (RAM) и дисковой к одному уровню называется виртуальной памятью). Однако, при этом имеет место незначительная потеря производительности, поскольку реализация виртуальной памяти предусматривает обмен данными с диском. Кроме того, работа с динамическими переменными требует большего внимания со стороны программиста.

 

Новый термин: Динамической называется переменная или объект, которая размещается в куче.

 

Новый термин: Куча прикладной программы Windows есть вся виртуальная память компьютера.

 

 

Выделение динамической памяти в программе на Object Pascal осуществляется с помощью специальных подпрограмм. К ним относятся функции AllocMem, GetMem и New. Функция AllocMem реализует наилучший метод динамического размещения с очисткой выделенной памяти. Обратимся к примеру с записью типа TMailingListRecord. В том примере переменная MLRecord является статической и, следовательно, размещается в стеке:

 

var

MLRecord: TMailingListRecord;

begin

{ Заполнить MLRecord данными. }

MLRecord.FirstName:= 'Per';

MLRecord.LastName:= 'Larsen';

{ и т.д. }

end;

 

Теперь воспользуемся динамической переменной:

 

var

APtr: PMailingListRecord;

begin

APtr:= AllocMem(SizeOf(TMailingListRecord));

APtr.FirstName:= 'Per';

APtr.LastName:= 'Larsen';

{........... }

FreeMem(APtr);

end;

 

Здесь мы объявили переменную APtr типа PMailingListRecord, которая является типизированным указателем на запись типа TMailingListRecord. Таким образом, в стеке программы появится переменная APtr, значением которой будет адрес участка динамической памяти, выделяемой в результате обращения к функции AllocMem. Параметром в обращении к этой функции является количество байт, определяющее размер участка динамической памяти. Здесь размер памяти вычисляется с помощью функции SizeOf. В результате обращения к AllocMem в куче создается экземпляр динамической переменной типа TMailingListRecord. Далее мы можем обращаться к полям записи как обычно.

После того как необходимость использования динамической переменной отпадает, связанную с ней память необходимо «вернуть в кучу» (освободить). Для этого используется процедура FreeMem.

Итак, мы рассмотрели правила, связанные с понятием «динамическая переменная». Использовать в программах такие динамические переменные или нет – решает программист. Однако, что касается объектов – представителей классов объектно–ориентированного программирования, то они могут быть только динамическими.

 

ПРИМЕЧАНИЕ: Пустое значение указателя обозначается ключевым словом nil. Например, проверить связан ли указатель с динамической памятью или нет можно так:

 

if SomePointer = nil then SomePointer:= AllocMem(Size);

 

 

 




Поделиться с друзьями:


Дата добавления: 2015-04-29; Просмотров: 333; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.