Читайте также: |
|
Организация памяти. Статические и динамические структуры данных
Статическая память. 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 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Организация работы станций по приему и отправлению пассажирских поездов, стр. 19 | | | Динамическая память |