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