Статическая переменная
В компьютерном программировании — статическая переменная это переменная , которая была выделена «статически», что означает, что ее время жизни (или «объем») соответствует всему запуску программы. В этом отличие от короткоживущих автоматических переменных , память которых выделяется и освобождается в стеке вызовов ; и в отличие от объектов , память которых динамически выделяется и освобождается в куче памяти .
Время жизни переменной контрастирует с областью действия (где переменная может использоваться): «глобальные» и «локальные» относятся к области действия, а не к времени жизни, но область действия часто подразумевает время жизни. Во многих языках глобальные переменные всегда являются статическими, но в некоторых языках они являются динамическими, тогда как локальные переменные обычно являются автоматическими, но могут быть статическими.
В общем, Статическое выделение памяти — это выделение памяти во время компиляции , до того, как соответствующая программа будет выполнена, в отличие от динамического выделения памяти или автоматического выделения памяти , когда память выделяется по мере необходимости во время выполнения . [1]
История
[ редактировать ]Статические переменные датируются по крайней мере АЛГОЛом 60 (1960 г.), где они известны как собственные переменные :
Объявление может быть помечено дополнительным собственным декларатором. Это приводит к следующему эффекту: при повторном входе в блок значения собственных величин будут неизменны от их значений на последнем выходе, а значения объявленных переменных, не помеченных собственными, будут неопределенными.
— Переработанный отчет по АЛГОЛУ 60, раздел «5. Объявления», стр. 14
Это определение слегка отличается от статической переменной: оно определяет только поведение и, следовательно, время жизни, но не хранилище: собственная переменная может быть выделена, например, при первом вызове функции, а не во время загрузки программы.
Использование слова static для обозначения этих переменных датируется, по крайней мере, BCPL (1966 г.) и было популяризировано языком программирования C , на который сильно повлиял BCPL. Определение BCPL гласит:
(1) Статические элементы данных:
Те элементы данных, размер которых длится столько же, сколько время выполнения программы; такие элементы данных имеют явные постоянные значения L. Каждый элемент статических данных должен быть объявлен либо в определении функции или подпрограммы, либо в глобальном объявлении, либо в виде метки, заданной двоеточием.- Справочное руководство BCPL, 7.2 Распределение пространства и объем элементов данных.
Обратите внимание, что BCPL определил «элемент динамических данных» для того, что теперь называется автоматической переменной (локальной, выделяемой в стеке), а не для объектов, выделяемых в куче, что является текущим использованием термина динамическое выделение .
The static
Ключевое слово используется в C и родственных языках как для статических переменных, так и для других понятий.
Адресация
[ редактировать ]по абсолютному адресу Режим адресации можно использовать только со статическими переменными, поскольку это единственные типы переменных, местоположение которых известно компилятору во время компиляции. Когда программа ( исполняемый файл или библиотека ) загружается в память, статические переменные сохраняются в сегменте данных программы адресного пространства (если инициализирована) или сегменте BSS (если не инициализирована) и сохраняются в соответствующих разделах объектных файлов до к загрузке.
Объем
[ редактировать ]С точки зрения области действия и размера статические переменные действуют на протяжении всего выполнения программы, но могут иметь более ограниченную область действия . Основное различие заключается между статической глобальной переменной , которая имеет глобальную область видимости и, таким образом, находится в контексте всей программы, и статической локальной переменной , которая имеет локальную область видимости. Статическая локальная переменная отличается от локальной переменной, поскольку статическая локальная переменная инициализируется только один раз, независимо от того, сколько раз вызывается функция, в которой она находится, а ее значение сохраняется и доступно через множество вызовов функции, в которой она объявлена. , например, для использования в качестве переменной-счетчика. Статическая переменная также может иметь область действия модуля или какой-либо ее вариант, например внутреннюю связь в C , которая является формой области действия файла или области действия модуля.
Пример
[ редактировать ]Пример статической локальной переменной в C:
#include <stdio.h>
void Func() {
static int x = 0;
// |x| is initialized only once across five calls of |Func| and the variable
// will get incremented five times after these calls. The final value of |x|
// will be 5.
x++;
printf("%d\n", x); // outputs the value of |x|
}
int main() {
Func(); // prints 1
Func(); // prints 2
Func(); // prints 3
Func(); // prints 4
Func(); // prints 5
return 0;
}
Объектно-ориентированное программирование
[ редактировать ]В объектно-ориентированном программировании также существует концепция статической переменной-члена , которая представляет собой « переменную класса » статически определенного класса, т. е. переменную-член данного класса, которая является общей для всех экземпляров (объектов), и доступен как переменная-член этих объектов. Переменная класса динамически определенного класса в языках, где классы могут быть определены во время выполнения, выделяется при определении класса и не является статической.
Константы объекта, известные во время компиляции, такие как строковые литералы , обычно выделяются статически. В объектно-ориентированном программировании таблицы виртуальных методов классов обычно выделяются статически. Статически определенное значение также может быть глобальным по своей области, гарантируя, что одно и то же неизменяемое значение используется во время выполнения для обеспечения согласованности.
См. также
[ редактировать ]- Константа (компьютерное программирование)
- Глобальная переменная
- Статический метод
- Локальное хранилище потока
Примечания
[ редактировать ]- ^ Джек Ронс. «Что такое статическое распределение памяти и динамическое распределение памяти?» . MeritHub [Институт развития карьеры] . Проверено 16 июня 2011 г.
Компилятор выделяет необходимое пространство памяти для объявленной переменной. С помощью оператора адреса можно получить зарезервированный адрес, и этот адрес можно присвоить переменной-указателю. Поскольку большинство объявленных переменных имеют статическую память, этот способ присвоения значения указателя переменной-указателю известен как выделение статической памяти. Память выделяется во время компиляции.
[ мертвая ссылка ]
Ссылки
[ редактировать ]- Керниган, Брайан В .; Ричи, Деннис М. (1988). Язык программирования C (2-е изд.). Река Аппер-Сэддл, Нью-Джерси: PTR Prentice Hall. ISBN 0-13-110362-8 .
- Язык программирования C++ (специальное издание) Бьярна Страуструпа (Аддисон Уэсли, 2000; ISBN 0-201-70073-5 )