Классы памяти в языке Си.

Все переменные в программе характеризуются не только типом, но и классом памяти. В языке Си существует четыре класса памяти:

  • Автоматический (automatic);
  • Регистровый (register);
  • Статический (static);
  • Внешний (external).

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

1. Автоматический (automatic)

По умолчанию, локальные переменные имеют класс auto. Такие переменные располагаются на стеке, а их область видимости ограничена своим блоком. Спецификатор auto уведомляет компилятор о том, что локальная переменная, перед именем которой он стоит, создаётся при входе в блок и разрушается при выходе из блока. Все переменные, определённые внутри функции, являются автоматическими по умолчанию, и поэтому ключевое слово auto используется крайне редко. Пример:

int nVar = 5;

2. Регистровый (register)

Когда мы определяем регистровую переменную, то мы просим компилятор, чтобы переменная располагалась в регистре, а не в оперативной памяти. Компилятор может сделать переменную регистровой, если позволяют условия (регистры не заняты, и по мнению компилятора это не приведёт к увеличению издержек). Регистровые переменные определяются с помощью служебного слово register перед типом:

register int x = 20;
register int y = 30;

Так как регистровая переменная не имеет адреса, то к ней не применима операция взятия адреса, это вызовет ошибку во время компиляции. Аргументы функции также могут быть заданы как register. Внутри функции они будут вести себя также, как и регистровые переменные.

Применять register можно только к near указателям и целому типу. Использовать register можно и при указании формальных параметров функций. Примеры:

register int nVar;
int func(register int var);

3. Статический (static)

Спецификатор static указывает компилятору на хранение локальной переменной во время всего жизненного цикла программы вместо ее создания и разрушения при каждом входе в область действия и выходе из неё. Следовательно, возведение локальных переменных в ранг статистических позволяет поддерживать их значения между вызовами функций.

Модификатор static можно также применять к глобальным переменным. В этом случае область видимости такой переменной ограничивается файлом, в котором она объявлены, это означает, что переменная будет иметь внутреннюю привязку. Внутренняя привязка говорит о том, что индикатор известен только внутри своего файла. Если функция объявлена как static, то она видна только в своём файле. Из другого файла к static функции обратиться нельзя.

Пример. Объявим в отдельном модуле две функции: одну статическую, а другую обычную:

static int staticFunc(int nVar) //статическая
      {
        return ++nVar;
      }

int simpleFunc(int nVar) //обычная
      {
        return ++nVar;
      }

4. Внешний (external)

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

Класс памяти extern в Си используем в двух случаях:

  • если переменная объявляется в программе ниже, чем ссылка на неё;
  • если переменная объявлена в другом модуле.

Пример:

#include <stdio.h>
int x=145; //Описание внешней переменной
main()
{
extern int x,y;
printf("x=%d y=%d \n",x,y);
}
int y=541; //Описание внешней переменной

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

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Добавить комментарий

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

Chinese (Traditional)EnglishJapaneseRussianUkrainian

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: