Инкапсуляция. Векторы и массивы, страница 2


248


Глава 6. Инкапсуляция



содержимое этого компонента, то есть его r-значение, то по найденному адре (/-значению) получить это значение не составляет труда.

Другие операции над векторами включают их создание и уничтожение, пр своение значения компонентам вектора и арифметические операции над пара» векторов одинаковой размерности, например их сложение (при этом складываю ся значения соответствующих компонентов). Поскольку векторы имеют разме ность, вставка и удаление компонентов не допускаются; может меняться толы значение компонента. В большинстве языков имеется довольно ограниченный н бор операций с векторами, но APL содержит большое количество операций, позв ляющих, в частности, осуществлять декомпозицию вектора на компоненты и о здавать новые векторы различными способами.

Реализация. Однородность компонентов и фиксированная размерность ва торов упрощают их хранение и доступ к отдельным компонентам. Однородное: означает, что размер и структура каждого компонента одинаковые, а размерное! вектора подразумевает инвариантность количества компонентов и их местополс жения в течение всего времени его жизни. Подходящим способом реализации т; кой структуры является последовательное представление компонентов в памян как показано на рис. 6.3. В эту структуру также может быть включен дескрипщ описывающий некоторые или все атрибуты вектора, особенно в том случае, есл они окончательно определяются только во время выполнения программы. Верх нюю и нижнюю границы диапазона значений индексов (которые не требуются дл: доступа к компонентам) обычно сохраняют в дескрипторе на случай, если потре буется проверка соответствия индекса объявленному диапазону. Другие атрибу ты обычно не хранятся в дескрипторе во время выполнения программы; они нуж ны только во время компиляции для контроля типов и определения способ представления вектора в памяти.

Если начинать с первого компонента вектора, то для доступа к 1-му компонен ту следует пропустить I - 1 компонентов. Если размер каждого компонента Е, ti следует пропустить (I - 1) х Е минимально адресуемых областей памяти (ячеек) Если LB — нижняя граница диапазона индексов, то количество пропускаемых ком понентов будет I - 1_Вили(1 - LB) х Е ячеек памяти. Если первый компонент век тора начинается с ячейки с адресом ос, то для /-значения компонента вектора полу чается следующая формула доступа:

l-значение(А[I]) = а + (I - LB) х Е

Это можно переписать как

l-значение(А[I]) - (се - LB х Е) + (I х Е)

Обратите внимание на то, что когда для вектора выделено место в памяти, выражение (а - LB х Е) становится постоянной величиной (обозначим ее К) и формула доступа упрощается:

7-значение(А[I]) = К + I х Е

Для языков типа FORTRAN величина К является постоянной и может быть вычислена во время компиляции. Это обеспечивает достаточно быстрый доступ к компонентам вектора. Даже в языках типа Pascal, где каждый аргумент К может быть переменным, К нужно вычислить только один раз, когда вектору отводится определенное место в памяти. Следовательно, доступ к элементам массива эффек-


6.1. Структурированные типы данных


249