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

Виды переменных и областей памяти Распределение памяти для переменных скалярных типов

Во всех языках программирования существует понятие так называемых «базовых типов данных», которые также называют основными или скалярными типами. Размер области памяти, необходимый для лексической единицы скалярного типа, считается заранее известным. Он определяется семантикой языка и архитектурой целевой вычислительной системы.

Например, в языке программирования C базовыми типами данных являются типы char, int, long int и т. п. (реально этих типов, конечно, больше, чем три), а в языке программирования Pascal — типы byte, char, word, integer и т. п.. Размер базового типа int в языке C для архитектуры компьютера на базе 16-разрядных процессоров составляет 2 байта, а для 32-разрядных процессоров — 4 байта. Разработчики исходной программы на этом языке, конечно, могут узнать данную информацию, но если ее использовать в исходной программе напрямую, то такая программа будет жестко привязана к конкретной архитектуре целевой вычислительной системы. Чтобы исключить эту зависимость, лучше использовать механизм определения размера памяти для типа данных, предоставляемый языком программирования — в языке C это функция sizeof.

Распределение памяти для сложных структур данных

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

Вот правила распределения памяти под основные виды структур данных:

  • для массивов — произведение числа элементов в массиве на размер памяти для одного элемента (то же правило применимо и для строк, но во многих языках строки содержат еще и дополнительную служебную информацию фиксированного объема);

  • для структур (записей с именованными полями) — сумма размеров памяти по всем полям структуры;

  • для объединений (союзов, общих областей, записей с вариантами) — размер максимального поля в объединении;

  • для реализации объектов (классов) — размер памяти для структуры с такими же именованными полями плюс память под служебную информацию объектно-ориентированного языка (как правило, фиксированного объема).

Формулы для вычисления объема памяти можно записать следующим образом:

для массивов:   Vмас = i=1,n(mi) * Vэл,

где n — размерность массива, mi — количество элементов i-ой размерности, Vэл — объем памяти для одного элемента;

для структур:    Vстр = i=1,nVполяi,

где n — общее количество полей в структуре, Vполяi — объем памяти для i-го поля структуры;

для объединений:     Vстр = maxi=1,nVполяi,

где n — общее количество полей в объединении, Vполяi — объем памяти для i-го поля объединения.

Для более сложных структур данных входного языка объем памяти, отводимой под эти структуры данных, вычисляется рекурсивно. Например, если имеется массив структур, то при вычислении объема отводимой под этот массив памяти для вычисления объема памяти, необходимой для одного элемента массива, будет вызвана процедура вычисления памяти структуры. Такой подход определения объема занимаемой памяти очень удобен, если декларативная часть языка представлена в виде дерева типов. Тогда для вычисления объема памяти, занимаемой типом из каждой вершины дерева, нужно вычислить объем памяти для всех потомков этой вершины, а потом применить формулу, связанную непосредственно с самой вершиной (этот механизм подобен механизму СУ-перевода, применяемому при генерации кода). Как раз такого типа древовидные конструкции строит синтаксический анализ для декларативной части языка.

Например, если рассмотреть фрагмент текста входной программы на языке Pascal:

...

type

  arr1 = array[1..10,1..20] of integer;

 

  rec1 = record

    v1: word;

    a1: arr1;

  end;

 

  rec2 = record

    v1: byte;

    case (v2: integer) of

    0: v3: byte;

    1: v4: word;

    3: v5: integer;

  end;

 

  arr2 = array[1..100] of rec2;

 

var

  aa1: arr1;

  vv1,vv2,vv3,vv4: byte;

  rr1: rec1;

  aa2arr2;

...

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

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