Размещение прямоугольных массивов в последовательной памяти

Массивы

В качестве примера рассмотрим трёх­мерный прямоугольный массив (3 слоя по 4 строки по 5 элементов в строке). Такой массив можно представить в виде паралле­лепи­педа (рис 3.). Предположим, что элементы массива следуют в памяти в лексико­графическом порядке, то есть так, что первым изменяется последний индекс. Такой порядок используется в большинстве алгоритмических языков, но есть и исключения, например, Фортран. Порядковый номер элемента массива A[i][j][k] можно вычислить по формуле:

i * Объем слоя + j * Длина строки + k

В общем случае описание массива может иметь вид:

A[i1:j1][i2:j2]…[in:jn]

где im, jmнижняя и верхняя граница индекса в m-м измерении. Каждый раз, когда программа обращается к элементу массива, она должна вычислить его адрес по заданным индексам k1,k2…kn. Функция упорядочения, которая это делает, имеет вид:

где L – искомый адрес; b – начальный адрес массива (адрес его 1-го элемента); Dm – объем m-го сечения массива (слоя, строки…) в байтах. В общем случае функцию упорядочения можно записать в виде:

, где

Константу с называют базовым адресом массива, который определяется как адрес возможно несуществующего элемента массива, у которого все индексы равны нулю.

Пример: для массива с границами индексов 3:5,1:4,0:1 имеем:

D3=1

D2=(j3-i3+1)*D3=2

D1=(j2-i2+1)*D2=8

с=b-(i1*D1+i2*D2+i3*D3)=26*(b-1)

И функция упорядочения имеет вид:

L=25*(b-1)+8*k1+2*k2+k3

Функция упорядочения строится компиляторами автоматически. Исходные данные о массиве представляются обычно в виде информационного вектора массива:

IA=(n, число элементов, C, D1, D2,…Dn, i1, j1, i2, j2,…in, jn)