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

Высокая стоимость доступа к упакованному вектору является причиной, по которой они обычно хранятся в неупакованном виде: каждый компонент распо-


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


251


лагается в начале отведенного ему байта или слова. Тогда упрощается доступ, зато возрастает объем занимаемой памяти. Но с течением времени машины, в которых адресуемой единицей памяти является байт, вытесняют те, в которых такими единицами служат слова; в связи с этим вопрос о выборе между описанными представлениями в настоящее время возникает довольно редко.

Рис. 6.4. Несмежные области хранения дескриптора и компонентов массива

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

Основная проблема реализации таких операций с векторами связана с ресурсами памяти, необходимыми для хранения результатов этих операций. В резуль-


252


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



тате сложения двух векторов, состоящих из ста элементов, получается третий вектор того же размера. В том случае, если полученный результат тут же не присваивается какому-либо существующему объекту, представленному своим /-значением, для хранения r-значения результата сложения требуется временно выделить для него память. Если в программе таких операций много, то общий объем памяти, необходимой для хранения промежуточных результатов, может оказаться достаточно большим и управление распределением этих дополнительных блоков памяти может значительно усложнить выполнение программы и увеличить ее стоимость.

Многомерныемассивы

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

Спецификация и синтаксис. Атрибуты многомерного массива отличаются от атрибутов вектора только тем, что требуется указывать диапазон изменения значений индекса для каждого измерения отдельно, как, например, в следующем объявлении языка Pascal:

В: array[1..10, -5..5] of real:

Выбор компонента требует указания одного индекса для каждого измерения (например, В[2.4] для двухмерного массива).

Реализация. Матрицу удобно реализовать, если рассматривать ее как вектор, состоящий из векторов; трехмерный массив можно рассматривать как вектор, компонентами которого являются матрицы и т. д. Заметим, что все эти компоненты должны, в свою очередь, состоять из одинакового количества элементов одного типа.