Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Си++ Занятие 7.doc
Скачиваний:
2
Добавлен:
17.11.2019
Размер:
59.39 Кб
Скачать

1.2 Классы памяти

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

Ключевые слова для обозначения классов памяти и их иерархия в С показаны в табл.1

Таблица 1

динамический класс памяти

статический класс памяти

локальное время жизни

глобальное время жизни

автоматический

регистровый

статический (внутренний)

статический (внешний)

auto

register

static

extern

Обычно программа оперирует с множеством объектов: переменных и функций. Все они по отношению к конкретной функции делятся на внешние и внутренние объекты.

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

Внутренние переменные определяются внутри функций.

Автоматический класс памяти

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

Вне блоков и функций этот спецификатор не используется.

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

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

Инициализация автоматических переменных выполняется всякий раз при входе в блок, в котором они объявлены.

Если инициализация переменных в объявлении отсутствует, то их начальное значение не определено и содержит непредсказуемое значение.

Спецификатор auto явно используется редко, он подразумевается по умолчанию при любом объявлении в теле функции или в блоке операторов.

Класс памяти register

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

Если в момент начала выполнения кода в данном блоке операторов все регистры заняты, транслятор обеспечивает обращение как с объектами класса auto, т.е. располагает объекты в локальной области памяти.

Класс static (внутренний статический класс памяти)

Спецификатор static относит переменную к внутреннему статическому классу памяти. Переменная, объявленная как static, располагается по фиксированному адресу в памяти компа, причем объявление может находиться как в теле функции или блока операторов, так и вне.

Область видимости у переменных класса static локальна, т.е. переменные доступны только в тех блоках или функциях, в которых объявлялись.

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

В отличие от auto- переменных, static-переменные не уничтожаются, когда функция или блок завершают работу, и их значения сохраняться последующих вызовах функции (или блока). Переменная с классом памяти static может, подобно другим переменным, получить начальное значение присваиванием константного выражения – это явная инициализация. Явная инициализация выполняется только один раз при первом обращении, если же переменная не инициализируется, то ей присваивается нулевое значение.

Класс extern (внешний статический класс памяти)

Спецификатор extern делает переменную глобальной, т.е. относит ее к внешнему статическому классу памяти.

Время жизни глобальных объектов – с момента определения и до конца выполнения программы. Переменные extern доступны (видимы) во всем файле программы. Можно сделать переменную видимой и в других исходных файлах, для чего в этих файлах ее также следует объявить со спецификатором extern. Глобальные переменные всегда инициализируются, и если это не сделано явно, то они инициализируются нулевым значением.

Сравнительная характеристика свойств переменных разных классов памяти приведена в табл. 2 и 3

Таблица 2

Инициализация

время жизни

область видимости

нет начального значения

начальное значение задано

auto

нет инициализации. Значение не определено

задается при каждом входе в функцию

локально

локальна

static

автоматическая, инициализация 0

задается 1 раз при первом обращении

Глобально в пределах одного модуля

локальна

extern

автоматическая, инициализация 0

задается 1 раз при первом обращении

глобально во всех модулях

глобальна во всех модулях

Таблица 3

Способ выделения памяти

auto

Память выделяется динамически во время работы программы (адрес заранее не определен)

static

Память выделяется один раз при компиляции программы (располагается по фиксированному адресу)

extern

Память выделяется при компиляции программы (располагается по фиксированному адресу)

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