stringtranslate.com

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

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

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

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

История

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

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

—  Доработанный отчет по АЛГОЛу 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 ; // |х| инициализируется только один раз за пять вызовов |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 г. Компилятор выделяет необходимое пространство памяти для объявленной переменной. С помощью оператора адреса можно получить зарезервированный адрес, и этот адрес можно присвоить переменной-указателю. Поскольку большинство объявленных переменных имеют статическую память, этот способ присвоения значения указателя переменной-указателю известен как выделение статической памяти. Память выделяется во время компиляции.[ мертвая ссылка ]

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