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

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

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

В целом, распределение статической памяти распределение памяти в время компиляции, перед выполнением связанной программы, в отличие от распределение динамической памяти или же автоматическое выделение памяти где память распределяется по мере необходимости в время выполнения.[1]

История

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

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

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

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

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

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

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

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

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

Обращение

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

Объем

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

Пример

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

#включают <stdio.h>пустота Func() {  статический int Икс = 0;  // | x | инициализируется только один раз за пять вызовов | Func | и переменная  // будет увеличиваться в пять раз после этих вызовов. Конечное значение | x |  // будет 5.  Икс++;  printf("% d п", Икс);  // выводит значение | x |}int главный() {  Func();  // выводит 1  Func();  // выводит 2  Func();  // выводит 3  Func();  // выводит 4  Func();  // выводит 5  возвращаться 0;}

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

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

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

Смотрите также

Примечания

  1. ^ Джек Ронс. «Что такое статическое и динамическое распределение памяти?». http://www.merithub.com/: MeritHub [Институт развития карьеры]. Получено 2011-06-16. Компилятор выделяет необходимое пространство памяти для объявленной переменной. С помощью оператора addressof получается зарезервированный адрес, и этот адрес может быть назначен переменной-указателю. Поскольку большинство объявленных переменных имеют статическую память, такой способ присвоения значения указателя переменной-указателю известен как выделение статической памяти. Память назначается во время компиляции.

Рекомендации