Как правило, статический объект «создается» компилятором во время компиляции. Его поведение в отношении выхода из программы, вероятно, будет различным в разных языках. Например, в C вообще нет специальной обработки (и AFAIK, что также верно для Objective-C). Часто эти объекты «живут» в области памяти только для чтения, которую создал компилятор и «прикрепил» к программе. Когда программа загружается в память, эта область только для чтения отображается в памяти программы, что является очень быстрой операцией. Например, все статические строки (как в printf("I'm a static string.");
) в C обрабатываются таким образом.
Тогда есть стек , он же стек вызовов и стек. Стек в целом - это просто структура данных, она же LIFO («последний пришел первым»). Стек вызовов действительно создается ОС и обычно имеет ограниченный размер. Здесь хранится вся информация, необходимая для вызова функции. Это означает, что для каждого вызова функции, ее аргументов и другой информации «помещается» в стек (помещается поверх стека), и резервируется небольшое место для переменных функции. Как только функция возвращается, все эти вещи удаляются, и остается только возвращаемое значение (хотя даже это не всегда верно, часто возвращаемое значение передается в регистр ЦП).
Вы можете сохранять значения в стеке, а языки, подобные C ++, даже позволяют хранить объектов в стеке. Они «автоматически» очищаются, как только возвращается их вмещающая функция.
Вы можете также хранить указатель на такой объект, находящийся в стеке, и в другой переменной. Но вы, вероятно, имеете в виду, что обычно вы создаете объект в куче (например, через new
в Java, C ++, C # и т. Д. Или alloc
в Objective-C) и получаете указатель в ответ на этот объект.
В начало: статические объекты известны компилятору во время компиляции, но все, что связано с кучей и стеком, по определению известно только в время выполнения .