Глобальные и локальные данные
Структура программы. Глобальные и локальные данные (области видимости и время жизни)
Структура программы
Любая программа на языке C++ представляет собой одну или множество функций. Среди этих функций должна обязательно присутствовать главная функция main (), являющаяся точкой входа в программу (выполнение программы начинается с выполнения этой функции).
Основное требование по использованию функций состоит в том, что определение любой функции должно предшествовать ее вызову (компилятору необходимо “знать”, как вызвать ту или иную функцию: какое значение она возвращает, что собой представляют ее параметры). Возникновение коллизий, связанных с этим правилом, разрешается использованием прототипов функций.
В языке C++ отсутствует понятие вложенных функций, то есть внутри определять другие функции нельзя.
Глобальные и локальные данные
В языках программирования очень большое значение имеют понятия область видимости и время жизни объектов программы.
Область видимости это часть текста программы, в котором может быть использован данный объект.
Время жизни переменной - интервал выполнения программы, в течение которого программный объект существует в памяти.
Оба эти понятия тесно связаны с понятием блока программы. Блоком в программе является последовательность объявлений или операторов, заключенных в фигурные скобки {}. Существуют два типа блоков:
1) составной оператор;
2) определение функции.
Блоки могут включать в себя составные операторы и другие блоки, но не могут содержать определения функции, то есть внутри функции нельзя определить другую функцию.
Объекты, объявленные вне блоков, обычно называют глобальными объектами. С этой точки зрения все функции программы являются глобальными объектами. Время жизни функций – все время выполнения программы. Область видимости функций начинается с точки ее объявления (это определение самой функции или объявление ее прототипа) и заканчивается при завершении программы. Кроме функций на глобальном уровне можно определять и другие программные объекты – константы, переменные, типы данных и т.д. Их время жизни и область видимости также начинаются с точки объявления.
Переменные и другие программные объекты, определенные внутри блока называют локальными объектами. Временем жизни таких объектов обычно является блок, в котором эти объекты определены. Область видимости локальных объектов – промежуток между объявлением локального объекта и концом блока, в котором эти объекты определены. В функции все формальные параметры и другие объекты, которые определены внутри тела функции являются локальными. Почти все они создаются в памяти (в стеке) на время работы функции и уничтожаются при ее завершении.
Рассмотрим пример:
int I = 10; // Глобальная переменная
…….
void F ( int a ) // Параметр а – локальная переменная
{
cout << I; // На экране 10 – значение глобальной переменной I
……
if ( I ) // Анализируется значение глобальной переменной I
{
int I = 200, J = 3000; // Локальные переменные
cout << I; // На экране 200 – значение локальной переменной I
…….
}
cout << I; // На экране 10 – значение глобальной переменной I
cout << J; // Ошибка – переменной J больше не существует
……
}
При совпадении имен глобального и локального объекта локальный объект “перекрывает“ глобальный объект (в нашем примере – переменные I).
Время жизни и область видимости локальных переменных, определенных на уровне заголовка цикла for, – весь оператор for:
for ( int a = 0, b = 10; a < 20; ++ a, -- b)
{
…….
cout << a * b;
…….
}
Здесь, хотя переменные a и b определены вне блока, их можно использовать внутри блока тела цикла.
Областью видимости и временем жизни программных объектов можно управлять, используя модификаторов классов памяти.
Классы памяти
Модификаторы (спецификаторы) классов памяти используются для управления временем жизни и областью видимости программных объектов. Чаще всего они применяются к переменным. Например, формат определения переменной включает в себя возможность указания класса памяти переменной:
[< класс памяти >] < тип данных > < идентификатор > [< инициализация >]
В языке C++ определены 4 основные класса памяти:
· auto
· register
· static
· extern
Спецификатор auto используется при определении локальных объектов (переменных внутри функций или блоков). Указание класса памяти auto используется крайне редко, поскольку по умолчанию (когда класс памяти не указывается) все локальные переменные являются автоматическими, т.е. принадлежат классу памяти auto. Объекты, имена которых объявляются со спецификатором auto, размещаются в динамически распределяемой памяти (в стеке) непосредственно перед началом выполнения функции или блока операторов. При выходе из блока или при возвращении из функции, соответствующая область памяти освобождается и все ранее размещённые в ней объекты уничтожаются. Таким образом, спецификатор влияет на время жизни объекта (это время локально). Например:
Void F ( int i )
{
int j = 20;
if ( i == 10 )
{
double Pi = 3.14;
……..
}
}
В этой функции все переменные (i, j, Pi) являются локальными автоматическими объектами. Переменные i иj создаются в памяти в начале выполнения функции и уничтожаются при выходе из функции. Время жизни и область видимости этих переменных одинаковы и соответствуют всему телу функции. Переменная Pi создается в памяти, когда начинает выполняться соответствующий блок инструкции if, и уничтожаются при выходе из этого блока.
Спецификатор register используется довольно часто для увеличения быстродействия программы. Этот спецификатор “просит” компилятор поместить соответствующую переменную в памяти так, чтобы доступ к ней осуществлялся как можно быстрее. Регистровые переменные размещаются либо в регистрах процессора, либо в кэш-памяти компьютера. Поскольку объем такой памяти ограничен, компилятор эту “просьбу” может и не выполнить. В этом случае регистровые переменные создаются как обычные автоматические переменные. Пример определения регистровой переменной:
register double d = 1.23;
С помощью спецификатора класса памяти extern осуществляется обращение к глобальным переменным, определенным либо в других файлах проекта, либо далее в этом же файле. Например:
Void F ()
{
Дата добавления: 2019-02-07; просмотров: 982;