- •Лекция 3 Базовые и производные типы
- •Представление данных
- •Атрибуты данных
- •Типы данных
- •Базовые типы
- •Производные типы
- •Скалярные типы
- •Структурированные типы
- •Описание информационного объекта в программе Определение и объявление объекта
- •Примеры описаний программных объектов
- •Определение и инициализация переменных целых типов
- •Определение и инициализация переменных вещественных типов
- •Определение и инициализация переменных булевского типа
- •Определение и инициализация переменных символьного типа
- •Определение и инициализация переменных-указателей
- •Определение и инициализация переменных-ссылок
- •Форматы некоторых производных типов и их интерпретация
- •Класс памяти информационного объекта
- •Область действия идентификатора информационного объекта программы
- •Примеры использования переменных разных классов памяти
- •Пространство имен
- •Основные правила написания и оформления программ
Класс памяти информационного объекта
Класс памяти информационного объекта задает:
-
место его размещения (регистр, стек, сегмент данных, динамическая память и т.п.);
-
время жизни (постоянное или временное):
- объекты с локальной продолжительностью жизни
- объекты со статической продолжительностью жизни
- объекты с динамической продолжительностью жизни
-
область видимости – часть программы, из которой допустим обычный доступ к области памяти, связанной с именем объекта;
Все взаимосвязанные атрибуты (тип, класс памяти, область действия имени, видимость и пр.) информационных объектов программы приписываются им с помощью описаний, а также контекстом, в котором эти описания появляются.
Класс памяти в С++ может быть установлен:
-
синтаксисом определения (для этих целей используются спецификаторы);
-
расположением в исходном коде;
-
двумя этими факторами.
Спецификаторы класса памяти информационного объекта программы:
-
auto – спецификатор автоматического класса памяти, указывающий на то, что объект располагается в локальной (автоматически распределяемой) памяти и при необходимости инициализируется каждый раз при выполнении оператора; спецификатор используется в операторах определения переменных в теле функций, а также внутри блоков операторов; объекты, имена которых определяются со спецификатором auto, размещаются в локальной памяти непосредственно перед началом выполнения функции или блока операторов; при выходе из блока или при возвращении из функции, соответствующая область локальной памяти освобождается, и все ранее размещённые в ней объекты уничтожаются; таким образом, спецификатор влияет на время жизни объекта (оно локально); спецификатор auto используется редко, поскольку все объекты, определяемые непосредственно в теле функции или в блоке операторов и так по умолчанию располагаются в локальной памяти; вне блоков и функций этот спецификатор не используется;
-
register – ещё один спецификатор автоматического класса памяти; представляет из себя "ненавязчивую просьбу" к транслятору (если это возможно) о размещении значений объектов, объявленных с этим спецификатором в одном из доступных регистров, а не в локальной памяти; если по какой-либо причине в момент начала выполнения кода в данном блоке операторов регистры оказываются занятыми, транслятор обеспечивает с этими объектами обращение, как с объектами класса auto ( очевидно, что в этом случае объект располагается в локальной области памяти);
-
extern – спецификатор внешнего статического класса памяти, обеспечивающий существование объекта с момента его объявления до конца выполнения программы и означающий, что объект определяется в другом месте программы (в другом файле или дальше по тексту); спецификатор extern используется для создания глобального объекта программы, доступного во всех файлах (модулях) программы, в которых он объявлен.
-
stаtic – спецификатор внутреннего статического класса памяти; применяется только(!) к именам объектов и функций и имеет в C++ два значения:
-
первое означает, что определяемый объект располагается по фиксированному адресу (тем самым обеспечивается постоянное время жизни объекта с момента его определения до конца выполнения программы и его инициализация только один раз – при первом выполнении оператора, содержащего его определение);
-
второе означает локальность, т.е. что объект, объявленный со спецификатором static, локален в данном программном модуле (то есть, недоступен из других модулей многомодульной программы) или в классе;
-
статические переменные могут быть локальными и глобальными, в зависимости от расположения оператора описания; глобальные статические переменные видны только в том файле (модуле), в котором описаны;
.
Спецификаторы auto и register относят к динамическим классам памяти, т.к. адреса объектов, описываемых с их помощью, будут меняться в процессе выполнения программы.