Jump to content

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

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

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

В общем, Статическое выделение памяти — это выделение памяти во время компиляции , до того, как соответствующая программа будет выполнена, в отличие от динамического выделения памяти или автоматического выделения памяти , когда память выделяется по мере необходимости во время выполнения . [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;
}

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

[ редактировать ]

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

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

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ Джек Ронс. «Что такое статическое распределение памяти и динамическое распределение памяти?» . MeritHub [Институт развития карьеры] . Проверено 16 июня 2011 г. Компилятор выделяет необходимое пространство памяти для объявленной переменной. С помощью оператора адреса можно получить зарезервированный адрес, и этот адрес можно присвоить переменной-указателю. Поскольку большинство объявленных переменных имеют статическую память, этот способ присвоения значения указателя переменной-указателю известен как выделение статической памяти. Память выделяется во время компиляции. [ мертвая ссылка ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 098756ce315a9bbd08aa115bb8b9686b__1718890800
URL1:https://arc.ask3.ru/arc/aa/09/6b/098756ce315a9bbd08aa115bb8b9686b.html
Заголовок, (Title) документа по адресу, URL1:
Static variable - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)