Використання вільної пам'яті, Детальна інформація

Використання вільної пам'яті
Тип документу: Реферат
Сторінок: 11
Предмет: Комп`ютерні науки
Автор: Олексій
Розмір: 20.2
Скачувань: 1405
байти. Звільнення ділянки задається аналогічним викликом процедури FREEMEM: freemem(p, num*sizeof(Longint)). У програмі слід звільняти ділянки такого самого розміру, що одержувалися, інакше наслідки можуть стати непередбачуваними.

Погляд на ділянку пам'яті як на послідовність елементів типу T реалізується за допомогою безтипового вказівника, перетвореного до типу ^T. Перетворений вказівник позначається виразом вигляду

^T(ім'я-вказівника).

Наприклад, якщо p – безтиповий вказівник, то вираз Parl(p) позначає вказівник, перетворений до типу Parl=^Arl. Тоді вираз Parl(p)^ задає адресу першого байта ділянки, на яку встановлено p. І, нарешті, вираз Parl(p)^[k], 0\xF0A3 k\xF0A3 16383, позначає елемент масиву з індексом k. Тобто замість імені масиву вживається вираз вигляду ^T(ім'я-вказівника).

Перешкодою є те, що розмір ділянки пам'яті не може бути більше ніж 65532 байти, тобто максимальна кількість елементів масиву типу T – 65532/sizeof(T). Але подолати це обмеження дуже просто за допомогою масиву безтипових вказівників. Наприклад, якщо нам потрібний масив у сто тисяч елементів типу Longint, означимо масив із 10 вказівників та кількість елементів 10000 у одній ділянці вільної пам'яті:

p : array[ 0..9 ]of pointer; num : Longint =10000.

Після встановлення вказівників на 10 ділянок

for cnt:=0 to 9 do getmem(p[cnt], num*sizeof(Longint))

елемент масиву з індексом k, де 0\xF0A3 k\xF0A3 9, задається виразом

Parl(p[k div num])^[k mod num].

І навпаки, вираз Parl(p[i])^[j] задає елемент масиву з індексом num*(i-1)+j.

Приклад. Наведемо програму, за якою створюється масив із 135 тисяч елементів типу LongInt, тобто по 4 байти. Елементам присвоюються їх порядкові номери. Далі друкуються значення тих елементів, номери яких кратні 4000, а також восьми останніх. Перед захопленням пам'яті та після нього друкуються загальний розмір незайнятої частини купи та найбільший розмір її суцільної незайнятої ділянки. Якщо за якихось причин виконання програми завершується аварійно, слід придивитися саме до останніх величин.

program arrptrfr;

const blocks=9;

type lng=longint; arl=array[0..0]of lng; parl=^arl;

var p : array[0..blocks-1]of pointer;

num, glob : lng ; k : lng; cnt: integer;

begin

num:=15000; glob:=num*blocks;

writeln( 'вільна пам''ять : ', memavail,

'; найбільша ділянка : ', maxavail);

for cnt:=0 to blocks-1 do getmem(p[cnt], num*sizeof(lng));

for k:=0 to glob-1 do

parl(p[k div num])^[k mod num]:=k;

cnt:=0;

for k:=0 to glob-1 do

begin

if (k mod 4000 = 0) or (k>glob-1-8) then

begin

write(k:8, parl(p[k div num])^[k mod num]:8);

The online video editor trusted by teams to make professional video in minutes