618_____________________________________________Глава 11

Класс памяти определяется, в частности, местом объявления переменной. Ло-
кальные переменные объявляются внутри некоторого блока или функции. Эти пе-
ременные видны только в пределах того блока, в котором они объявлены. Блоком
называется фрагмент кода, ограниченный фигурными скобками «{ }». Глобаль-
ные переменные объявляются вне какого-либо блока или функции.

Спецификации класса памяти могут быть разбиты на два класса: автомати-
ческий класс памяти с локальным временем жизни и статический класс памя-
ти с глобальным временем жизни. Ключевые слова auto и register используются
для объявления переменных с локальным временем жизни. Эти спецификации
применимы только к локальным переменным. Локальные переменные создаются
при входе в блок, в котором они объявлены, существуют лишь во время активно-
сти блока и исчезают при выходе из блока.

Спецификация auto, как и другие спецификации, может указываться перед
типом в объявлении переменных. Например:

auto float x, у;

Локальные переменные являются переменными с локальным временем жизни
по умолчанию, так что ключевое слово auto используется редко. Далее мы будем
ссылаться на переменные автоматического класса памяти просто как на автомати-
ческие переменные.

Пусть, например, имеется следующий фрагмент кода:

(
int i=l;

...

i++;                                                                     -I

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

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

register int i = 1;

Если интенсивно используемые переменные, такие как счетчики или суммы
могут сохраняться в аппаратных регистрах, накладные расходы на повторную за-;

грузку переменных из памяти в регистр и обратную загрузку результата в память-j
могут быть исключены. Это сокращает время вычислений.                  :

Компилятор может проигнорировать объявления register. Например, можете
оказаться недостаточным количество регистров, доступных компилятору для ис-'
пользования. К тому же оптимизирующий компилятор способен распознавать час-;

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

Ключевые слова extern и static используются, чтобы объявить идентификатор
ры переменных как идентификаторы статического класса памяти с глобальным
временем жизни. Такие переменные существуют с момента начала выполнения
программы. Для таких переменных память выделяется и инициализируется сразу
после начала выполнения программы.