Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Автоматическая память

Читайте также:
  1. Аксессуар на память...
  2. Бессознательная память
  3. Больше мозг — больше и память
  4. БП2 (Биопамять Бытия Матрица) 2000 изм
  5. В ПАМЯТЬ О МАЛЬЧИКЕ, КОТОРЫЙ КРИЧАЛ: ВОЛК!
  6. Вечная память!

Организация памяти. Статические и динамические структуры данных

 

Статическая память. 1

Автоматическая память. 1

Динамическая память. 2

Распределение оперативной памяти. 3

Процедуры New и Dispose. 5

Процедуры GetMem и FreeMem.. 8

Управление блоками динамической памяти. 8

 

 

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

Статическая память

Статическая память выделяется переменным на всё время выполнения программы. Метод прост и не требует никакой поддержки в ходе выполнения программы, так как адреса переменных в этом случае могут быть определены ещё на этапе компиляции программы.

В языке Turbo Pascal нет явного упоминания о статической памяти, но фактически к ней можно отнести память, в которой размещаются константы и переменные, которые описаны на уровне главной программы. Пример программы с использованием статической памяти.

program Static;

var i: Integer;

procedure Sub;

var Cnt:integer;

begin inc(Cnt); WriteLn('Cnt = ',Cnt) end;

begin

for i:=1 to 3 do Sub;

end.

В этой программе константа Cnt, а фактически инициализируемая переменная, не смотря на то, что является локальной в процедуре Sub, существует во время выполнения программы. При запуске программы её значение не теряется после выхода из процедуры Sub вплоть до следующего входа в неё.

Автоматическая память

Автоматическая память характерна для языков с блочной структурой. В отличие от статической она позволяет использовать одни и те же участки основной памяти для размещения разных переменных из разных программных блоков. Дело в том, что память для локальных переменных блока, выделяется только на время его выполнения. Это повышает эффективность использования памяти, но требует некоторой поддержки управления памятью в ходе выполнения программы, что несколько снижает производительность. Оказалось, что снижение производительности можно свести к минимуму, если использовать для управления памятью принцип стека, но это приводит к вложенной организации блоков программы.

Для примера рассмотрим два варианта построения программы решения одной и той же задачи: Найти произведение сумм элементов массива.


 

program Prgm1; const m = 10000; var a: array[1..m] of Integer; b: array[1..m] of Real; i,Sa: Integer; Sb: Real; begin { Ввод массивов a и b } Sa:=0; Sb:=0; for i:=1 to m do Sa:=Sa+a[i]; for i:=1 to m do Sb:=Sb+b[i]; WriteLn(Sb*Sa); end.   program Prgm2;const m = 10000;var Sa: Integer; Sb: Real;procedure SumA;var a: array[1..m] of Integer; i: Integer;begin{ Ввод массива a }for i:=1 to m do Sa:=Sa+a[i];end; procedure SumB;var b: array[1..m] of Real; i: Integer;begin{ Ввод массива b }for i:=1 to m do Sb:=Sb+b[i];end;beginSa:=0; Sb:=0;SumA; SumB;WriteLn(Sb*Sa);end.

Не смотря на то, что это абстрактные программы, они обе формально правильные и можно попытаться их выполнить. При попытке выполнить первую программу мы получим сообщение об ошибке компиляции "Error 96". Причина ошибки заключается в том, что общий объём памяти, который выделяется переменным уровня главной программы не должен превышать 64 KB. Учитывая, что переменная типа Integer занимает 2 байта, а типа Real - 6 байтов, то для нашей программы мы получим оценку 10000*(6+2) B = 80000 B = (80000 / 1024) KB = 78.2 KB, что превышает имеющиеся возможности.

Попытка выполнить вторую программу тоже приводит к сообщению об ошибке компиляции - "Error 202" (переполнение стека). Так как массивы находятся в разных процедурных блоках программы, а они вызываются последовательно, то это означает, что массивы последовательно используют одну и ту же память в стеке. Оценка необходимого объёма памяти в этом случае составляет 6*10000 B = 58.6 KB - размер большего массива. Причина ошибки состоит в том, что по умолчанию размер стека составляет всего 16 KB, но, к счастью, его можно увеличить до значения 65 520 B, что составляет почти 64 KB. Для этого в интегрированной среде надо выбрать Options | Memory sizes и установить желаемый размер стека. После этого вторая программа будет выполняться без ошибок.

 


Дата добавления: 2015-07-11; просмотров: 236 | Нарушение авторских прав


Читайте в этой же книге: Распределение оперативной памяти | Процедуры New и Dispose | Управление блоками динамической памяти |
<== предыдущая страница | следующая страница ==>
Организация работы станций по приему и отправлению пассажирских поездов, стр. 19| Динамическая память

mybiblioteka.su - 2015-2024 год. (0.008 сек.)