stringtranslate.com

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

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

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

В общем,Статическое выделение памяти — это выделение памяти вовремя компиляции, до того, как будет выполнена соответствующая программа, в отличие отдинамического выделения памятиилиавтоматического выделения памяти, когда память выделяется по мере необходимости вовремя выполнения.[1]

История

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

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

—  Пересмотренный отчет по АЛГОЛ 60, раздел «5. Декларации», стр. 14

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

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

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

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

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

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

Адресация

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

Объем

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

Пример

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

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

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

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

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

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

Примечания

  1. ^ Джек Ронс. "Что такое статическое выделение памяти и динамическое выделение памяти?". MeritHub [Институт развития карьеры] . Получено 16 июня 2011 г. Компилятор выделяет необходимое пространство памяти для объявленной переменной. Используя оператор addressof, можно получить зарезервированный адрес, и этот адрес может быть назначен переменной-указателю. Поскольку большинство объявленных переменных имеют статическую память, этот способ назначения значения указателя переменной-указателю называется статическим выделением памяти. Память выделяется во время компиляции.[ мертвая ссылка ]

Ссылки