Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
организация памяти.doc
Скачиваний:
13
Добавлен:
09.02.2015
Размер:
186.37 Кб
Скачать

Дисциплина «Основы алгоритмизации и программирование» Организация памяти. Статические и динамические структуры данных

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

Статическая память 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;

begin

Sa:=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 и установить желаемый размер стека. После этого вторая программа будет выполняться без ошибок.