Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБОРАТОРНАЯ РАБОТА практика 2в.doc
Скачиваний:
13
Добавлен:
17.12.2018
Размер:
138.24 Кб
Скачать

Выравнивание границ областей памяти

Говоря об объеме памяти, занимаемой различными лексическими единицами и структурами данных языка, следует упомянуть еще один момент – выравнивание границ областей памяти, отводимых для различных лексических единиц.

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

Например, если мы имеем описание переменных на языке C:

static char c1, c2, c3;

то, зная, что под одну переменную типа char отводится 1 байт памяти, можем ожидать, что для описанных выше переменных потребуется всего 3 байта памяти. Однако если кратность адресов для доступа к памяти установлена 4 байта, то под эти переменные будет отведено в целом 12 байт памяти, из которых 9 не будут использоваться.

Выравнивание границ областей памяти возможно как по границам структур данных (и представляющих их лексем), так и внутри самих структур данных для составляющих их элементов. Например, если мы имеем описание массивов на языке Pascal:

a1,a2: array[1..3] of char;

то при условии, что под одну переменную типа char отводится 1 байт памяти и кратность адресов установлена 4 байта, в случае, когда выравнивание границ областей памяти выполняется только по границам самих областей, под описанные выше переменные потребуется 8 байт памяти (по 4 байта на каждый массив). Если же выравнивание границ областей памяти выполняется и для составляющих элементов (в данном случае – элементов массивов), то под эти же переменные потребуется 24 байта памяти (по 4 байта на один элемент массива – и в целом 12 байт на каждый массив).

Как правило, разработчику исходной программы не нужно знать, каким образом компилятор распределяет адреса под отводимые области памяти. Чаще всего компилятор сам выбирает оптимальный метод, и, изменяя границы выделенных областей, он всегда корректно осуществляет доступ к ним. Вопрос об этом может встать, если с данными программы, написанной на одном языке, работают программы, написанные на другом языке программирования (чаще всего, на языке ассемблера), реже такие проблемы возникают при использовании двух различных компиляторов с одного и того же входного языка. Большинство компиляторов позволяют пользователю в этом случае самому указать, использовать или нет кратные адреса и какую границу кратности установить (если это вообще возможно с точки зрения архитектуры целевой вычислительной системы).

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

Размер типа arr1 будет составлять V1 = 10*20*4 = 800 байт. Размер типа rec1 составит V2 = 2+800 = 802 байта, но с учетом кратности (4 байта) для его размещения потребуется V2' = 4+800 = 804 байта. Размер типа rec2 V3 = 1+4+Max(1,2,4) = 9 байт с учетом кратности составит V3' = 12 байт, а размер типа arr2 с учетом кратности составит V4' = 100*12 = 1200 байт. Тогда для размещения переменной aa1 потребуется 800 байт памяти, для размещения переменных vv1,vv2,vv3,vv4 с учетом кратности потребуется 4*4 = 16 байт памяти, для переменной rr1 – 804 байта, а для переменной aa2 – еще 1200 байт. Таким образом, для размещения в памяти всей описанной структуры данных потребуется выделить V' = 2820 байт памяти.

При тех же условиях, но с выравниванием границ памяти по элементам структур, необходимые объемы памяти в данном случае не изменятся. Размер типа arr1 будет составлять V1 = 10*20*4 = 800 байт. Размер типа rec1 с учетом кратности составит V2" = 4+800 = 804 байта. Размер типа rec2 с учетом кратности составит V3' = 4+4+Max(4,4,4) = 12 байт, а размер типа arr2 с учетом кратности составит V4' = 100*12 = 1200 байт.

Видно, что объем требуемой памяти в обоих случаях увеличился примерно на 12.5%, но за счет этого увеличивается эффективность обращения к данным и, следовательно, скорость выполнения результирующей программы.

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]