Каждый объект в C ++ имеет два вложенных периода времени, связанных с ним: продолжительность хранения и время жизни . Срок хранения - это период, на который выделяется необработанная память, занятая объектом. Время жизни - это период между созданием и разрушением реального объекта в этой памяти. (Для объектов типа POD разрушение конструкции либо не имеет значения, либо неприменимо, поэтому их время жизни соответствует продолжительности их хранения).
Когда кто-то говорит «выделенный», он обычно ссылается на продолжительность хранения . На самом деле язык не указывает точно, когда начинается срок хранения объекта. Достаточно потребовать, чтобы он начался в какой-то момент до того, как начнется время жизни объекта .
По этой причине в общем случае статический объект, определенный внутри функции, может никогда не начать свое время жизни, и, теоретически, его продолжительность хранения также не должна начинаться. Так что, теоретически, он может даже не «распределиться».
Однако на практике все объекты со статической продолжительностью хранения («глобальные», локальные статические и т. Д.) Обычно обрабатываются одинаково: им назначается определенный объем памяти на раннем этапе при запуске программы.
В качестве дополнительного примечания, если локальный объект со статической продолжительностью хранения требует нетривиальной инициализации, эта инициализация выполняется, когда элемент управления передает определение в самый первый раз. Так что в этом примере
void foo() {
static int *p = new int[100];
}
динамический массив никогда не будет выделен, если функция никогда не вызывается. И он будет выделен только один раз, если функция будет вызвана. Это не похоже на то, о чем вы спрашиваете, но я упоминаю об этом на всякий случай.