Найти в Дзене
Жаркое лето ZZ-го

Язык С++. 8.1. Статическая память.

Статическая (не путать со статистической) память выделяется еще до начала работы программы, на стадии компиляции и сборки. У статических переменных фиксированный адрес, выделенный до запуска программы и не меняющийся в процессе ее работы. Естественно, статические переменные создаются и инициализируются до входа в функцию main, с которой начинается выполнение программы. Существует два типа статических переменных: · глобальные переменные - это переменные, определенные вне функций, в описании которых отсутствует слово static. Обычно описания глобальных переменных, включающие слово extern, выносятся в заголовочные файлы (h-файлы). Слово extern означает, что переменная описывается, но не создается в данной точке программы. Определения глобальных переменных, т.е. описания без слова extern, помещаются в файлы реализации (c-файлы или cpp-файлы). Пример: глобальная переменная max описывается дважды: в h-файле с помощью строки: extern int max; это описание сообщает о наличии такой переменной,

Статическая (не путать со статистической) память выделяется еще до начала работы программы, на стадии компиляции и сборки. У статических переменных фиксированный адрес, выделенный до запуска программы и не меняющийся в процессе ее работы. Естественно, статические переменные создаются и инициализируются до входа в функцию main, с которой начинается выполнение программы.

Существует два типа статических переменных:

· глобальные переменные - это переменные, определенные вне функций, в описании которых отсутствует слово static. Обычно описания глобальных переменных, включающие слово extern, выносятся в заголовочные файлы (h-файлы). Слово extern означает, что переменная описывается, но не создается в данной точке программы. Определения глобальных переменных, т.е. описания без слова extern, помещаются в файлы реализации (c-файлы или cpp-файлы). Пример: глобальная переменная max описывается дважды:

в h-файле с помощью строки:

extern int max;

это описание сообщает о наличии такой переменной, но не создает эту переменную!

В cpp-файле с помощью строки:

int max = 1000;

это описание создает переменную max и присваивает ей начальное значение 1000. Заметим, что стандарт языка не требует обязательного присвоения начальных значений глобальным переменным, но, по правилам хорошего стиля , это лучше делать всегда, иначе в переменной будет содержаться непредсказуемое значение (мусор, как говорят программисты).

Глобальные переменные называются так потому, что они доступны в любой точке программы во всех ее файлах. Поэтому имена глобальных переменных должны быть достаточно длинными, чтобы избежать случайного совпадения имен двух разных переменных. Например, имена типа x или n для глобальной переменной лучше не использовать;

· статические переменные - это переменные, в описании которых присутствует слово static. Как правило, статические переменные описываются вне функций. Такие статические переменные во всем подобны глобальным, с одним исключением: область видимости статической переменной ограничена одним файлом, внутри которого она определена, - и, более того, ее можно использовать только после ее описания, т.е. ниже по тексту. По этой причине описания статических переменных обычно выносятся в начало файла. В отличие от глобальных переменных, статические переменные никогда не описываются в h-файлах (модификаторы extern и static конфликтуют между собой). Использовать статические переменные стоит в тех случаях, когда нужно, чтобы они были доступны только для функций, описанных внутри одного и того же файла. И в таких ситуациях стоит избегать использования глобальных переменных, чтобы не было конфликтов имен при реализации больших проектов, состоящих из сотен файлов.

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

· как указание типа памяти: переменная располагается в статической памяти, а не в стеке;

· как способ ограничить область видимости переменной рамками одного файла (в случае описания переменной вне функции).

Слово static может присутствовать и в заголовке функции. При этом оно используется только для того, чтобы ограничить область видимости имени функции рамками одного файла. Пример:

static int gcd(int x, int y);  // Прототип ф-ции

. . .

static int gcd(int x, int y) // Реализация(определение ф-ции)

{

    . . .

}

Совет: используйте модификатор static в заголовке функции, если известно, что функция будет вызываться лишь внутри одного файла. Слово static должно присутствовать как в описании прототипа функции, так и в заголовке функции при ее реализации.