статические глобальные переменные обычно выделяют фиксированный адрес во время компиляции.Многие ОС предоставляют области памяти с инициализацией 0, другие отображают часть исполняемого образа с предварительно инициализированными данными, а также полностью неинициализированными областями.В зависимости от того, может ли компилятор обработать правильное начальное содержимое статической переменной во время компиляции, он может выбрать наиболее подходящую из этих областей памяти, вызывая любую инициализацию во время выполнения позже, если потребуется.Например:
static int x; // needs to be 0 before main() runs
// best way: 0-initialised memory area
static int y = 3; // best way: map/copy area of executable already containing "3"
static int z = time(NULL); // initial value unimportant
// best way: uninitialised memory area
// pre-main() init code
Примечания: например, z
помещается в 0-инициализированную память, а затем сжимается, что не приводит к значительным потерям - просто не является строго необходимым.Некоторые ОС могут иметь отдельные области для значений только для чтения / констант.
статические локальные переменные с известными начальными значениями во время компиляции может быть создано согласно глобальным переменным.Для инициализированных значений времени выполнения (допустимых только в C ++) компиляторы склонны (должны?) Инициализировать их при первом вводе области.Как правило, это координируется наличием неявного вспомогательного логического значения для каждой области, содержащего статические локальные переменные: каждый раз, когда вводится область, используется логическое значение, чтобы увидеть, нужно ли инициализировать статику.На некоторых компиляторах это на самом деле может быть сделано менее эффективным, но поточно-ориентированным способом, так что статические локальные переменные могут использоваться для одноэлементных экземпляров.инициализированный до main()
, я написал некоторый код для изучения этого:
#include <stdio.h>
#include <time.h>
void f()
{
static int i = time(NULL);
printf("%d\n", i);
}
int main()
{
int i = time(NULL);
printf("%d\n", i);
sleep(2);
f();
}
С компилятором GCC C я получаю фатальную ошибку компиляции о локальном static i
, требующем инициализации во время выполнения.Скомпилированный как C ++ (мой основной язык), он совершенно легален и инициализируется во время выполнения и после ввода main()
- показывая, что эта часть моего объяснения выше относится только к C ++.
staticфункции просто помечаются в сгенерированном объекте так, что компоновщик не будет учитывать их при сопоставлении неразрешенных вызовов из других объектов.