КАТЕГОРИИ: Архитектура-(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; Просмотров: 357; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |