Ответ 1
Динамическая инициализация - это то, что значение инициализации неизвестно во время компиляции. Он вычислялся во время выполнения для инициализации переменной.
Пример
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 computed at runtime.
То есть, статическая инициализация обычно включает константное выражение (которое известно во время компиляции), тогда как динамическая инициализация включает в себя не константное выражение.
static int c;//this is also static initialization (with zero)!
В §3.6.2/1 из стандарта С++ (2003) говорится:
Объекты со статической продолжительностью хранения (3.7.1) должны быть нулевыми (8.5) перед любой другой инициализацией происходит. Нулевая инициализация и инициализация с константой выражения называются совместно статическая инициализация; все остальные инициализация динамическая инициализация.
Итак, есть два типа инициализаций:
- Статическая инициализация: либо нулевая инициализация, либо инициализация с постоянным выражением
- Любая другая инициализация - это динамическая инициализация.
Также обратите внимание, что одна и та же переменная может быть динамически инициализирована после статической инициализации. Например, см. Этот код:
int d = factorial(8);
int main()
{
}
Так как d
является глобальной переменной, она имеет статическое хранилище. Это означает, что согласно §3.6.2.1
он инициализируется до 0 на этапе статической инициализации, который происходит до того, как произойдет любая другая инициализация. Затем позже во время выполнения он динамически инициализируется значением, возвращаемым функцией factorial()
.
Это означает, что глобальные объекты могут быть инициализированы дважды: один раз статической инициализацией (которая является нулевой инициализацией), а позже, во время выполнения, они могут быть динамически инициализированы.