Урок 7.1.2. Указатели и модели памяти

7.1.2. Указатели и модели памяти

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

В зависимости от объема кода программы и данных, программу нужно скомпилировать для одной из шести моделей памяти, предлагаемых Турбо Си.

1. Tiny (крошечная). Под код программы, статические данные, кучу и стек отводится в сумме 64К памяти. В такой модели памяти для указателя требуется два байта (близкий указатель).

2. Small (маленькая). Под код программы отводится 64К, под стек, кучу и статические данные отводится в сумме 64К. В такой модели памяти программа работает также с близкими указателями.

3. Medium (средняя). Под код программы отводится 1Мгб памяти. Это обозначает, что все обращения к функциям и возвраты из функций, осуществляемые через указатель, должны использовать указатель длиной в четыре байта, чтобы в нем мог разместиться далекий адрес памяти (далекий указатель). Под стек, кучу и статические данные выделяется 64К памяти и, следовательно, для адресации данных используются близкие указатели.

4. Compact (компактная). Под код программы отводится 64К. Под данные отводится всего 1Мгб, но объем статических данных ограничивается размером 64К. Под стек выделяется 64К. Адресация внутри программы осуществляется близкими указателями, адресация – данных далекими указателями.

5. Large (большая). Под код программы отводится 1Мгб, под статические данные – 64К, куча может занимать до 1Мгб памяти. Как программа, так и данные адресуются далекими указателями.

6. Huge (огромная). Аналогична большой модели, но объем статических данных может превышать 64К. Для любой адресации необходимы далекие указатели.

7. Flat (плоская) — в плоской модели код и данные используют одно и то же адресное пространство. Фактически несегментированная модель памяти. Для для 32-битных процессоров плоская модель памяти позволяет адресовать 4 Гб оперативной памяти, для 64-битных — гипотетически до 16 эксабайт, фактически до 256 Тб.
(Эксаба?йт (Eb, Эб, Эбайт) — единица измерения количества информации, равная 1018.)

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

В некоторых случаях возникает необходимость задать размер указателя, отличный от размера, устанавливаемого при компиляции в той или иной модели памяти. Это можно сделать при помощи модификаторов описания указателей near, far и huge:

  • модификатор near устанавливает 16-тибитный, т.е. близкий указатель. При использовании near-указателей данные программы ограничены размером сегмента 64К;
  • модификатор far устанавливает 32-ухбитный, т.е. далекий указатель. При использовании far-указателей можно ссылаться на данные в пределах 1 мегабайта адресного пространства;
  • модификатор huge также устанавливает 32-ухбитный указатель аналогичный far-указателю, однако между ними есть различия. Во-первых, операции отношения ==, !=, <, >, <= и >= работают правильно с huge-указателями, а с far-указателями они работают неправильно. Во-вторых, все арифметические операции над указателями типа huge воздействуют как на адрес сегмента, так и на смещение, а при использовании указателей типа far воздействуют только на смещение.

Из-за того, что арифметические операции при работе с far-указателями воздействуют только на смещение, то хотя far-указатель и может адресовать данные в пределах одного мегабайта, данные, к которым идет обращение, должны начинаться и заканчиваться в пределах сегмента.

Например, все элементы массива, расположенного в нескольких сегментах, доступны при помощи huge-указателя, а при помощи far-указателя можно получить доступ только к элементам, расположенным в пределах данного сегмента, остальные будут недоступны для far-указателя, т.к. арифметические операции изменяют смещение, но оставляют неизменным адрес сегмента.

Попутно заметим, что для near–указателя ограничения еще более жесткие: все данные должны располагаться в пределах одного сегмента (для huge u far эти пределы – 1 Мб).

Рассмотрим способы описания указателей с модификаторами near, far и huge. Когда одно из этих ключевых слов встречается в описании, то оно модифицирует объект, расположенный справа от ключевого слова, например:

char far *ptr;            ptr описан как far-указатель,
int huge *ptr;           ptr описан как huge-указатель,
float near *ptr;         ptr описан как near-указатель,
int *(far *ptr);           ptr описан как far-указатель на указатель к данным целого типа,
char far b = 'B';       b описан как символьная переменная в дальнем сегменте данных;
char far* far ptrb = &b;  ptrb - дальний указатель на переменную в дальнем сегменте данных.

Для удобства основные данные этого параграфа собраны в таблицу:

DOS

Модель Код Данные Стек Указатель по умолчанию
Tiny

код+данные+стек+куча до 64Кбайт

near
Small 64 Кбайт данные+стек+куча до 64Кбайт near
Medium 1 Мбайт данные+стек+куча до 64Кбайт near
Compact 64 Кбайт 64 Кбайт 64 Кбайт far
Large 1 Мбайт 64 Кбайт 64 Кбайт far
Huge 1 Мбайт >64 Кбайт 64 Кбайт far

16-бит Windows EXE

Small 64 Кбайт данные+стек+куча до 64Кбайт near
Medium 1 Мбайт данные+стек+куча до 64Кбайт near
Compact 64 Кбайт данные+стек до  64 Кбайт far
Large 1 Мбайт данные+стек до  64 Кбайт far

16-бит Windows DLL

Small 64 Кбайт 64 Кбайт

-

far
Medium 1 Мбайт 64 Кбайт

-

far
Compact 64 Кбайт 64 Кбайт

-

far
Large 1 Мбайт 64 Кбайт

-

far

32-бит Windows

Flat 2 Гбайт 1 Мбайт 1 Мбайт far

 

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов