В компьютерном программировании , статическая переменная является переменной , которая была выделена «статически», а это означает , что его срок службы (или «степень») является весь прогон программы. Это контрастирует с короткоживущими автоматическими переменными , память которых выделяется и освобождается в стеке вызовов ; и в отличие от объектов , хранилище которых динамически выделяется и освобождается в памяти кучи .
Время жизни переменной контрастирует с областью действия (где переменная может использоваться): «глобальный» и «локальный» относятся к области действия, а не времени жизни, но область действия часто подразумевает время жизни. Во многих языках глобальные переменные всегда статичны, но в некоторых языках они динамические, а локальные переменные обычно автоматические, но могут быть статическими.
В общем, статическое выделение памяти - это выделение памяти вовремя компиляции, перед выполнением связанной программы, в отличие отдинамического выделения памятиилиавтоматического выделенияпамяти, когда память выделяется по мере необходимости вовремя выполнения. [1]
История
Статические переменные датируются как минимум АЛГОЛОМ 60 (1960), где они известны как собственные переменные :
Декларация может быть помечена дополнительным декларатором своим. Это имеет следующий эффект: при повторном входе в блок значения собственных количеств будут неизменными по сравнению с их значениями при последнем выходе, в то время как значения объявленных переменных, которые не помечены собственными, не определены.
- Доработанный отчет по АЛГОЛУ 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 возврат 0 ; }
Объектно-ориентированное программирование
В объектно-ориентированном программировании также существует концепция статической переменной-члена , которая является « переменной класса » статически определенного класса, т. Е. Переменной -членом данного класса, которая является общей для всех экземпляров (объектов), и доступен как переменная-член этих объектов. Переменная класса динамически определенного класса на языках, где классы могут быть определены во время выполнения, выделяется, когда класс определен, и не является статическим.
Константы объекта, известные во время компиляции, такие как строковые литералы , обычно выделяются статически. В объектно-ориентированном программировании таблицы виртуальных методов классов обычно размещаются статически. Статически определенное значение также может быть глобальным по своему объему, гарантируя, что одно и то же неизменное значение используется на протяжении всего прогона для согласованности.
Смотрите также
- Постоянная (компьютерное программирование)
- Глобальная переменная
- Статический метод
- Локальное хранилище потока
Заметки
- ^ Джек Ронс. «Что такое статическое и динамическое распределение памяти?» . http://www.merithub.com/ : MeritHub [Институт развития карьеры] . Проверено 16 июня 2011 .
Компилятор выделяет необходимое пространство памяти для объявленной переменной. Используя оператор addressof, получается зарезервированный адрес, и этот адрес может быть назначен переменной-указателю. Поскольку большинство объявленных переменных имеют статическую память, этот способ присвоения значения указателя переменной-указателю известен как выделение статической памяти. Память назначается во время компиляции.
Рекомендации
- Керниган, Брайан В .; Ричи, Деннис М. (1988). Язык программирования C (2-е изд.). Река Аппер Сэдл, штат Нью-Джерси: Prentice Hall PTR. ISBN 0-13-110362-8.
- Язык программирования C ++ (специальное издание) Бьярна Страуструпа (Addison Wesley, 2000; ISBN 0-201-70073-5 )