Существует (в широком смысле) три типичных сценария: распределение в стеке, выделение из кучи и статическое выделение.
Первое, что происходит, когда вы объявляете локальную переменную внутри функции:
void foo ( )
{
int bar = 42;
}
Здесь память для bar
выделяется в стеке . Он выделяется во время foo
вызова.
Второй сценарий происходит при создании экземпляра класса с оператором new
:
void foo ( )
{
MyClass* bar = new MyClass( );
}
Здесь память для i
выделяется в куче . Это снова происходит во время выполнения и происходит при выполнении оператора new
. Он работает в основном так же, как C malloc
, если вы более знакомы с этим.
Наконец, есть статическое распределение.
void foo ( )
{
static int bar = 42;
}
Здесь компилятор заранее знает, что для bar
потребуется память, и поэтому он вставляет в исполняемый файл инструкцию, указывающую исполняющему загрузчику зарезервировать пространство, или буквально освобождает место в исполняемом файле для переменной, чтобы постоянно находится в памяти. Поэтому память для bar
обычно выделяется во время выполнения, так как исполняемый файл загружается.