Динамическая инициализация - это та, в которой значение инициализации неизвестно во время компиляции. Он вычисляется во время выполнения для инициализации переменной.
Пример,
int factorial(int n)
{
if ( n < 0 ) return -1; //indicates input error
else if ( n == 0 ) return 1;
else return n * factorial(n-1);
}
int const a = 10 ; //static initialization
//10 is known at compile time. Its 10!
int const b = factorial(8); //dynamic initialization
//factorial(8) isn't known at compile time,
//rather it's computed at runtime.
То есть статическая инициализация обычно включает в себя константное выражение (которое известно во время компиляции), в то время как динамическая инициализация включает в себя неконстантное выражение.
static int c;//this is also static initialization (with zero)!
§3.6.2 / 1 из стандарта C ++ (2003) гласит:
Объекты со статической продолжительностью хранения
(3.7.1) инициализируется нулями
(8.5) перед любой другой инициализацией
происходит. Нулевая инициализация и
инициализация с константой
Выражение все вместе называются
статическая инициализация ; все остальные
инициализация динамическая
инициализация .
Итак, есть два вида инициализации:
- Статическая инициализация: либо нулевая инициализация, либо инициализация с постоянным выражением
- Любая другая инициализация является динамической инициализацией.
Также обратите внимание, что одна и та же переменная может быть динамически инициализирована после статической инициализации. Например, посмотрите этот код:
int d = factorial(8);
int main()
{
}
Поскольку d
является глобальной переменной, она имеет статическое хранилище. Это означает, что согласно §3.6.2.1
он инициализируется в 0 на этапе статической инициализации, который происходит до того, как произойдет любая другая инициализация . Затем, во время выполнения, он динамически инициализируется значением, возвращаемым функцией factorial()
.
Это означает, что глобальные объекты могут быть инициализированы дважды: один раз статической инициализацией (то есть инициализацией с нуля) и позже, во время выполнения, они могут быть динамически инициализированы.