Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры ТП!!.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
458.75 Кб
Скачать
  1. Модели памяти. Функции работы с динамической памятью.

Компилятор позволяет генерировать код для одной из шести моделей памяти:

tiny – крошечная модель, является наименьшей, все четыре системных регистра имеют одинаковое значение, таким образом в распоряжении программы всего 64 кб для кода и данных, стека, heap’а. Все указатели имеют тип near.

small – используется для приложений среднего размера, при этом сегмент кода и сегмент данных не перекрываются. В распоряжении программиста 64 кб под код и 64 кб под данные, стек и heap. Все указатели типа near.

medium – данная модель рекомендуется для программ среднего размера, не работающих с большим размером данных. Под код отводится до 1 Мб, под данные, стек и heap - 1сегмент=64 кб. В этом случае при вызове и возврате из функций по умолчанию используются указатели типа far и huge. При работе с данными – типа near.

compact – для разработки небольших приложений, работающими с большими объемами информации. Под код – 64 кб, под данные в общем – 1 Мб. Статические данные и стек не могут занимать более 64 кб каждый. Для указания переходов – указатели near. Для работы с динамическими данными far и huge.

large – под код до 1 Мб, статические данные – 64 кб, динамические данные (куча) – 1Мб. Все указатели дальние far или huge.

huge – все также как в large, статические данные – м.б. выделено до 1 Мб. Указатели дальние.

В Windows приложениях возможно ограничение расширений по памяти за счёт использования механизма подкачки информации из файлов. Если МП не позволяет разместить весь код или данные, то при очередном обращении проверяется специальный флаг использования: часть информации выгружается из памяти и замещается требуемой в текущий момент. Выгруженная информация помещается во временный файл на диске.

Работа с динамической памятью.

В С++ имеется набор функций для работы с динамической памятью. Это функции типа alloc, которые позволяют выполнять выделение и перераспределение памяти под динамические переменные произвольного размера.

1) malloc – возвращает указатель на блок динамической памяти заданного размера, void * malloc (size) – функция возвращает указатель типа void, поэтому требуется явное преобразование типов, например:

char * str;

int * count;

str=(char*)malloc(5);

будет выделено 5 блоков типа size of char

count=(int*)malloc(10*size of (int));

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

Программа освобождает всю запрашиваемую память с помощью функции free.

2) cаlloc – данная функция аналогична malloc, но имеет дополнительный параметр число отводимых блоков (N, size), N – количество отводимых блоков, каждый из которых имеет размер size. При выделении памяти каждый выделенный байт обнуляется. Данная функция доступна только в 16-разрядных приложениях, позволяет выделить память в пределах одного сегмента. Для получения памяти за пределами сегмента используются функции farmalloc и farcolloc. Освобождение памяти выполняется с помощью farfree. В остальном работа функций аналогична.

Иногда возникают ситуации, когда отведенная ранее память недостаточна для работы. В этом случае требуется перераспределение памяти. Для перераспределения памяти используется функция realloc.

Void * realloc (*block, size)

В качестве параметров которой указывается ссылка на ранее выделенный блок и размер в байтах для расширения этого блока. Функция realloc пытается расширить указанный выделенный ранее блок до указанного размера. Если значение size =0, то выделенная память на которую указывает блок освобождается. Если значение блока=NULL, то realloc работает как malloc. При необходимости выделить блок размером больше, имеющегося в наличии, содержимое участка памяти на который указывает блок копируется по новому адресу с одновременным расширением. Если данную операцию выполнить не удается, то функция возвращает NULL, в противном случае - значение нового адреса.

В С++ добавлены функции new и delete.

Функция new позволяет выделить память под переменную указанного типа.

int *p;

p=new int;

p=new int[10];

Освобождение памяти выделенной через new выполняется через delete, где указывается имя переменной в которую был записан указатель на выделенный участок памяти.

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