Статическая переменная

редактировать

В компьютерном программировании статическая переменная является переменной, который был выделен «статически», что означает, что его время жизни (или «экстент») - это весь запуск программы. Это контрастирует с более короткоживущими автоматическими переменными, память которых выделена в стеке и освобождена в стеке вызовов ; и в отличие от объектов, хранилище которых динамически выделяется и освобождается в кучной памяти.

Время жизни переменной контрастирует с областью ( где может использоваться переменная): «глобальный» и «локальный» относятся к области действия, а не времени жизни, но область действия часто подразумевает время жизни. Во многих языках глобальные переменные всегда статичны, но в некоторых языках они динамические, а локальные переменные обычно автоматические, но могут быть статическими.

В общем, выделение статической памяти - это выделение памяти во время компиляции до выполнения связанной программы, в отличие от распределения динамической памяти или автоматическое выделение памяти, когда память выделяется по мере необходимости во время выполнения.

Содержание

  • 1 История
  • 2 Адресация
  • 3 Область действия
    • 3.1 Пример
  • 4 Объектно-ориентированное программирование
  • 5 См. Также
  • 6 Примечания
  • 7 Ссылки

История

Статические переменные датируются как минимум АЛГОЛОМ 60 (1960), где они известны как собственные переменные:

Объявление может быть помечено дополнительным декларатором own. Это имеет следующий эффект: при повторном входе в блок значения собственные количества не изменятся по сравнению со своими значениями при последнем выходе, в то время как значения объявленных переменных, не отмеченных собственными, не определены.

— Доработанный отчет по АЛГОЛу 60, раздел «5. Объявления», с. 14

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

Использование слова static для ссылки на эти переменные датируется по крайней мере BCPL (1966 г.) и было популяризировано в языке программирования C, который был сильно зависит от BCPL. Определение BCPL гласит:

(1) Статические элементы данных:. Те элементы данных, экстенты которых существуют до тех пор, пока время выполнения программы; такие элементы данных имеют явные постоянные L-значения. Каждый статический элемент данных должен быть объявлен либо в определении функции или подпрограммы, либо в глобальном объявлении, либо в виде метки, установленной двоеточием.

— Справочное руководство BCPL, 7.2 Распределение пространства и объем элементов данных

Обратите внимание, что BCPL определил «динамический элемент данных» для того, что теперь называется автоматической переменной (локальной, выделенной стеком), а не для выделенной в куче объекты, что является текущим использованием термина динамическое размещение.

Ключевое слово static используется в C и родственных языках как для статических переменных, так и для других концепций.

Адресация

Абсолютный адрес Режим адресации может использоваться только со статическими переменными, поскольку это единственные типы переменных, расположение которых известно компилятором во время компиляции. Когда программа (исполняемый файл или библиотека) загружена в память, статические переменные сохраняются в сегменте данных адресного пространства программы (если инициализировано), или сегмент BSS (если он не инициализирован) и хранятся в соответствующих разделах объектных файлов перед загрузкой.

Область действия

С точки зрения области действия и степени, статические переменные охватывают весь запуск программы, но могут иметь более ограниченную область действия. Основное различие заключается между статической глобальной переменной, которая имеет глобальную область видимости и, таким образом, находится в контексте всей программы, и статической локальной переменной, которая имеет локальную область видимости. Статическая локальная переменная отличается от локальной переменной, поскольку статическая локальная переменная инициализируется только один раз, независимо от того, сколько раз вызывается функция, в которой она находится, и ее значение сохраняется и доступно через множество вызовов функции, в которой она объявлена., например для использования в качестве счетной переменной. Статическая переменная также может иметь область видимости модуля или какой-либо вариант, например, внутренняя связь в C, которая является формой области видимости файла или области модуля.

Пример

Пример статической локальной переменной в C:

#include void Func () {static int x = 0; // | x | инициализируется только один раз за пять вызовов | Func | и переменная // будет увеличиваться в пять раз после этих вызовов. Конечное значение | x | // будет 5. x ++; printf ("% d \ n", х); // выводит значение | x | } int main () {Func (); // выводит 1 Func (); // выводит 2 Func (); // выводит 3 Func (); // печатает 4 Func (); // выводит 5 return 0; }

Объектно-ориентированное программирование

В объектно-ориентированном программировании также существует концепция статической переменной-члена, которая представляет собой "переменная класса "статически определенного класса, т. е. переменная-член данного класса, которая является общей для всех экземпляров (объектов) и доступна как переменная-член этих объектов. Переменная класса динамически определенного класса на языках, где классы могут быть определены во время выполнения, выделяется, когда класс определен, и не является статическим.

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

См. Также

Примечания

Ссылки

Последняя правка сделана 2021-06-09 10:04:11
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте