Физическая структура

Физическая структура - это размещение элементов массива в

памяти ЭВМ. Для случая двумерного массива, состоящего из

(k1-n1+1) строк и (k2-n2+1) столбцов физическая структура предс-

тавлена на рис. 3.3.

@Mas +0 +SizeOf(Тип) +(k2-n2)*SizeOf(Тип)

┌─────┴────────┐ ┌───────┴───────┐ ┌───────┴────────┐

┌───────────────┬─────────────────┬── ─┬────────────────┐

│ Mas[n1,n2] │ Mas[n1,n2+1] │ ... │ Mas[n1,k2] │

├───────────────┼─────────────────┼── ─┼────────────────┤

............................................................

├───────────────┼─────────────────┼── ─┼────────────────┤

│ Mas[k1,n2] │ Mas[k1,n2+1] │ ... │ Mas[n1,k2] │

└───────────────┴─────────────────┴── ─┴────────────────┘

└──────┬───────┘ └────────┬───────┘ └────────┬───────┘

+(k1-n1)*(k2-n2+1)* +((k1-n1)*(k2-n2+1)+ +((k1-n1)*(k2-n2+1)+

*SizeOf(Тип) +1)*SizeOf(Тип) +(k2-n2))*SizeOf(Тип)

Рис. 3.3. Физическая структура двумерного массива из

(k1-n1+1) строк и (k2-n2+1) столбцов

Многомерные массивы хранятся в непрерывной области памяти.

Размер слота определяется базовым типом элемента массива. Коли-

чество элементов массива и размер слота определяют размер памяти

для хранения массива. Принцип распределения элементов массива в

памяти определен языком программирования. Так в FORTRAN элементы

распределяются по столбцам - так, что быстрее меняется левые ин-

дексы, в PASCAL - по строкам - изменение индексов выполняется в

направлении справа налево.

Количество байтов памяти, занятых двумерным массивом, опре-

деляется по формуле :

ByteSize = (k1-n1+1)*(k2-n2+1)*SizeOf(Тип) (3.3)

Адресом массива является адрес первого байта начального ком-

понента массива. Смещение к элементу массива Mas[i1,i2] определя-

ется по формуле:

ByteNumber = [(i1-n1)*(k2-n2+1)+(i2-n2)]*SizeOf(Тип) (3.4)

его адрес : @ByteNumber = @mas + ByteNumber.

Например:

var Mas : Array [3..5] [7..8] of Word;

Базовый тип элемента Word требует два байта памяти, тогда

таблица 3.2 смещений элементов массива относительно @Mas будет

следующей:

Таблица 3.2

┌────────┬─────────────┬────────┬─────────────┐

│Смещение│Идентификатор│Смещение│Идентификатор│

│ (байт) │ поля │ (байт) │ поля │

├────────┼─────────────┼────────┼─────────────┤

│ +0 │ Mas[3,7] │ +2 │ Mas[3,8] │

├────────┼─────────────┼────────┼─────────────┤

│ +4 │ Mas[4,7] │ +6 │ Mas[4,8] │

├────────┼─────────────┼────────┼─────────────┤

│ +8 │ Mas[5,7] │ +10 │ Mas[5,8] │

└────────┴─────────────┴────────┴─────────────┘

Этот массив будет занимать в памяти: (5-3+1)*(8-7+1)*2=12 байт; а

адрес элемента Mas[4,8]: @Mas+((4-3)*(8-7+1)+(8-7)*2 = @Mas+6