Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
61.doc
Скачиваний:
131
Добавлен:
11.05.2015
Размер:
451.58 Кб
Скачать

56. Классы памяти.

Каждая переменная и функция в программе на языке Си принадлежит к какому-либо классу памяти. Класс памяти переменной определяет время ее существования (время жизни) и область видимости (область определения), связанные с понятием блока программы (сколько времени и где существует).

Различают четыре класса памяти:

auto,register, extern, static.

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

Автоматическая переменная (auto)– это всегда локальная переменная, но не наоборот, т.е. видима (существует) от точки ее объявления и до конца блока, в котором она объявлена, кроме вложенных блоков, в которых эта переменная определяется повторно. Память для нее выделяется при входе в блок (автоматически) и освобождается (автоматически) при выходе из блока.

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

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

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

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

57. Автоматические и регистровые переменные.

Автоматическая переменная (auto)– это всегда локальная переменная, но не наоборот, т.е. видима (существует) от точки ее объявления и до конца блока, в котором она объявлена, кроме вложенных блоков, в которых эта переменная определяется повторно. Память для нее выделяется при входе в блок (автоматически) и освобождается (автоматически) при выходе из блока.

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

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