Введение
Переменная программирования, сохраняющая своё значение на протяжении всего времени работы программы.
В компьютерном программировании статическая переменная – это переменная, выделенная "статически", то есть её время жизни (или "существование") охватывает весь период выполнения программы. Это отличается от автоматических переменных с более коротким временем жизни, хранилище для которых выделяется и освобождается на стеке вызовов, а также от объектов, хранилище для которых динамически выделяется и освобождается в куче памяти. Время жизни переменной противопоставляется области видимости (где переменную можно использовать): термины "глобальная" и "локальная" относятся к области видимости, а не к времени жизни, хотя область видимости часто подразумевает время жизни. Во многих языках глобальные переменные всегда являются статическими, но в некоторых они могут быть динамическими, в то время как локальные переменные обычно являются автоматическими, но могут быть статическими. В общем случае, статическое выделение памяти – это выделение памяти во время компиляции, до начала выполнения программы, в отличие от динамического или автоматического выделения памяти, когда память выделяется по мере необходимости во время выполнения.
Обращение
Режим адресации по абсолютному адресу может использоваться только со статическими переменными, поскольку только для них компилятор известен адрес во время компиляции. Когда программа (исполняемый файл или библиотека) загружается в память, статические переменные хранятся в сегменте данных адресного пространства программы (если они инициализированы) или в сегменте BSS (если они не инициализированы), а до загрузки они хранятся в соответствующих секциях объектных файлов.
Область применения
С точки зрения области видимости и времени жизни, статические переменные сохраняют свое значение на протяжении всего выполнения программы, но могут иметь более ограниченную область видимости. Основное различие заключается между статической глобальной переменной, имеющей глобальную область видимости и, следовательно, доступной во всей программе, и статической локальной переменной, имеющей локальную область видимости. Статическая локальная переменная отличается от обычной локальной переменной тем, что она инициализируется только один раз, независимо от количества вызовов функции, в которой она объявлена, и ее значение сохраняется и доступно при последующих вызовах этой функции, например, для использования в качестве счетчика. Статическая переменная также может иметь область видимости модуля или ее вариант, такой как внутренняя связь в языке C, которая представляет собой форму области видимости файла или модуля.
Объектно-ориентированное программирование
В объектно-ориентированном программировании также существует понятие статической переменной-члена, которая является "переменной класса" статически определенного класса, то есть переменной-членом данного класса, совместно используемой всеми экземплярами (объектами) и доступной как переменная-член этих объектов. Переменная класса динамически определенного класса, в языках, где классы могут быть определены во время выполнения, выделяется при определении класса и не является статической. Объектные константы, известные во время компиляции, такие как строковые литералы, обычно выделяются статически. В объектно-ориентированном программировании таблицы виртуальных методов классов обычно выделяются статически. Статически определенное значение может также иметь глобальную область видимости, обеспечивая использование одного и того же неизменяемого значения на протяжении всего выполнения программы для обеспечения согласованности.