Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Особенности классов памяти
Объекты класса auto имеют локальное время жизни и локальную область видимости – только ту функцию или тот блок, где они объявлены. Такие переменные называются автоматическими. По умолчанию, т. е. без указания класса, все переменные, объявленные внутри блока, относятся к классу auto. Переменная класса auto начинает существовать при входе в блок, в котором она объявлена. Память под автоматическую переменную выделяется в стеке. При выходе из блока переменная автоматически исчезает. При этом память, отведенная под эту переменную, освобождается. При повторном входе в блок для этой переменной может быть выделен другой участок памяти. Объекты класса register также имеют локальное время жизни и локальную область видимости, однаков отличие от автоматических переменных, они размещаются на регистрах процессора и называются регистровыми переменными. Использование регистровой памяти обычно приводит к сокращению времени доступа к переменной. Если по каким-либо причинам переменная не может быть размещена на регистрах процессора, она помещается в стек. Регистровая переменная может быть только целочисленной, и к ней нельзя применить операцию & (получение адреса). Переменные, объявленные внутри блока со спецификатором класса памяти static, обеспечивают возможность сохранить значение переменной при выходе из блока и использовать его при повторном входе в блок. Такие переменные называются статическими. Статическая переменная имеет глобальное время жизни и одновременно локальную область видимости – она доступна только внутри блока, в котором объявлена. В отличие от переменных с классом auto, для переменных с классом static память выделяется в сегменте данных при объявлении переменной, и поэтому их значение сохраняется при выходе из блока. Переменные класса памяти static могут быть инициализированы константным выражением. Если явной инициализации нет, то такой переменной присваивается нулевое значение. При инициализации константным адресным выражением можно использовать адреса любых внешних объектов, кроме адресов объектов с классом памяти auto, так как адрес последних не является константой и изменяется при каждом входе в блок. Инициализация выполняется один раз при первом входе в блок. Переменная, объявленная с классом памяти extern, является ссылкой на глобальную переменную, объявленную в одном из исходных файлов программы с тем же самым именем. Цель такого объявления состоит в том, чтобы сделать доступной переменную, созданную в другом файле. Переменные класса extern называются внешними переменными. Объявление переменной со спецификатором extern информирует компилятор о том, что память для переменной выделять не требуется, так как это уже выполнено где-то в другом месте программы. Также внешнюю переменную нельзя инициализировать, поскольку она инициализируется в другом месте.
|