Программирование (Козлова) - страница 12

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

13. Область видимости

Областью при видимости называется часть текста программы, в которой может быть использован определенный объект. Объект является видимым в блоке или в исходном файле, когда в данном блоке или файле определены имя и тип объекта. Объект может быть видимым внутри блока, исходного файла или в каждом исходном файле, образующем программу. Это определяется тем, на каком уровне объявлен объект: на внутреннем (внутри определенного блока) или на внешнем (вне всех блоков). Когда объект объявлен внутри блока, он является видимым в данном блоке и в каждом внутреннем блоке. Когда объект объявлен на внешнем уровне, он является видимым от точки его объявления до завершения этого исходного файла. Объект можно сделать глобально видимым с помощью определенных объявлений во всех исходных файлах, образующих программу. Спецификатором класса памяти в объявлении переменной может быть auto, register, static или extern. Если класс памяти определен, он определяется по умолчанию из контекста объявления. Объекты, принадлежащие классам auto и register, обладают локальным временем жизни. Спецификаторы static и extern задают объекты, обладающие глобальным временем жизни. В случае объявления переменной на внутреннем уровне можно применить любой из четырех спецификаторов класса памяти, а если его не указали, то подразумевается auto. Переменная с классом памяти auto обладает локальным временем жизни и видна только в блоке, в котором объявлена. Память для данной переменной выделяется при входе в блок и высвобождается при выходе из блока. В случае повторного входа в блок этой переменной может быть выделен другой участок памяти. Переменная класса auto автоматически не инициализируется, так как она должна быть проинициализирована явно в случае объявления через присвоение ей начального значения. Значение неинициализированной переменной, класс памяти которой auto, считается неопределенным.

Спецификатор класса памяти register заставляет компилятор распределить память для переменной в регистре, если это возможно. Употребление регистровой памяти чаще всего приводит к сокращению времени доступа к переменной. Переменная, которая объявлена с классом памяти register, обладает той же областью видимости, что и переменная auto. Количество регистров, которые можно применить для значений переменных, не безгранично, так как не безграничны и возможности компьютера. В случае когда компилятор не обладает свободными регистрами, переменной выделяется память как для класса auto. Класс памяти register может указываться для переменных с типом int или указателей с размером, равным размеру int. Переменные, которые объявлены на внутреннем уровне со спецификатором класса памяти static, дают возможность сохранить вид переменной при выходе из блока и применять ее при повторном входе в блок. Данная переменная обладает глобальным временем жизни и областью видимости внутри блока, в котором она объявлена. Для переменных с классом static память выделяется в сегменте данных. В отличие от них переменные класса auto имеют память, которая выделяется в стеке. Исходя из этого, значение переменных с классом static сохраняется при выходе из блока.