Jump to content

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

(Перенаправлено из статических переменных )

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

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

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

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

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

— Revised report on ALGOL 60, section "5. Declarations", p. 14

This definition is subtly different from a static variable: it only specifies behavior, and hence lifetime, not storage: an own variable can be allocated when a function is first called, for instance, rather than at program load time.

The use of the word static to refer to these variables dates at least to BCPL (1966), and has been popularized by the C programming language, which was heavily influenced by BCPL. The BCPL definition reads:

(1) Static data items:
Those data items whose extents lasts as long as the program execution time; such data items have manifest constant Lvalues. Every static data item must have been declared either in a function or routine definition, in a global declaration or as a label set by colon.

— The BCPL Reference Manual, 7.2 Space Allocation and Extent of Data Items

Note that BCPL defined a "dynamic data item" for what is now called an automatic variable (local, stack-allocated), not for heap-allocated objects, which is the current use of the term dynamic allocation.

The static keyword is used in C and related languages both for static variables and other concepts.

Addressing

[edit]

The absolute address addressing mode can only be used with static variables, because those are the only kinds of variables whose location is known by the compiler at compile time. When the program (executable or library) is loaded into memory, static variables are stored in the data segment of the program's address space (if initialized), or the BSS segment (if uninitialized), and are stored in corresponding sections of object files prior to loading.

Scope

[edit]

С точки зрения области действия и размера статические переменные действуют на протяжении всего выполнения программы, но могут иметь более ограниченную область действия . Основное различие заключается между статической глобальной переменной , которая имеет глобальную область видимости и, таким образом, находится в контексте всей программы, и статической локальной переменной , которая имеет локальную область видимости. Статическая локальная переменная отличается от локальной переменной, поскольку статическая локальная переменная инициализируется только один раз, независимо от того, сколько раз вызывается функция, в которой она находится, а ее значение сохраняется и доступно через множество вызовов функции, в которой она объявлена. , например, для использования в качестве переменной-счетчика. Статическая переменная также может иметь область действия модуля или какой-либо ее вариант, например внутреннюю связь в 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
Номер скриншота №: 49bdab82d716c5191c75c9745f8f2bc8__1718890800
URL1:https://arc.ask3.ru/arc/aa/49/c8/49bdab82d716c5191c75c9745f8f2bc8.html
Заголовок, (Title) документа по адресу, URL1:
Static variable - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)