статические объекты против объектов на основе стека и кучи - PullRequest
0 голосов
/ 26 июня 2011

Мне попалось следующее определение:

Объект static - это объект, существующий с момента его создания и создания и до конца программы. Таким образом, объекты на основе стека и кучи исключаются. Статические объекты уничтожаются при выходе из программы, то есть их деструкторы вызываются, когда main завершает выполнение.

Почему исключаются объекты на основе стека и кучи ???

Вот что я знаю о стеках и кучах: стек - это часть системной памяти, где все переменные хранятся до выполнения. Куча - это часть системной памяти, где все переменные хранятся во время выполнения, например, динамически распределяемая память. Это означает, что если я объявлю целочисленную переменную i в своем коде и присвою ей значение скажем 123, то это будет сохранено в моем стеке, потому что компилятор знает значение во время компиляции (до запуска время). Но если я определю переменную-указатель и захочу инициализировать ее где-нибудь еще, тогда она будет храниться в моей куче, поскольку она неизвестна компилятору во время компиляции.

Ответы [ 3 ]

2 голосов
/ 26 июня 2011

Есть несколько сроков хранения:

  • Статический → весь срок действия программы
  • Автоматически (стек) → до конца текущей функции
  • Динамический (куча) → до тех пор, пока он не завершится явно (через delete)
1 голос
/ 26 июня 2011

Как правило, статический объект «создается» компилятором во время компиляции. Его поведение в отношении выхода из программы, вероятно, будет различным в разных языках. Например, в C вообще нет специальной обработки (и AFAIK, что также верно для Objective-C). Часто эти объекты «живут» в области памяти только для чтения, которую создал компилятор и «прикрепил» к программе. Когда программа загружается в память, эта область только для чтения отображается в памяти программы, что является очень быстрой операцией. Например, все статические строки (как в printf("I'm a static string.");) в C обрабатываются таким образом.

Тогда есть стек , он же стек вызовов и стек. Стек в целом - это просто структура данных, она же LIFO («последний пришел первым»). Стек вызовов действительно создается ОС и обычно имеет ограниченный размер. Здесь хранится вся информация, необходимая для вызова функции. Это означает, что для каждого вызова функции, ее аргументов и другой информации «помещается» в стек (помещается поверх стека), и резервируется небольшое место для переменных функции. Как только функция возвращается, все эти вещи удаляются, и остается только возвращаемое значение (хотя даже это не всегда верно, часто возвращаемое значение передается в регистр ЦП).

Вы можете сохранять значения в стеке, а языки, подобные C ++, даже позволяют хранить объектов в стеке. Они «автоматически» очищаются, как только возвращается их вмещающая функция.

Вы можете также хранить указатель на такой объект, находящийся в стеке, и в другой переменной. Но вы, вероятно, имеете в виду, что обычно вы создаете объект в куче (например, через new в Java, C ++, C # и т. Д. Или alloc в Objective-C) и получаете указатель в ответ на этот объект.

В начало: статические объекты известны компилятору во время компиляции, но все, что связано с кучей и стеком, по определению известно только в время выполнения .

0 голосов
/ 26 июня 2011

"Статический объект - это объект, существующий с момента его создания и создания и до конца программы. Таким образом, объекты на основе стека и кучи исключаются."

Почему исключаются объекты на основе стека и кучи ???

Они "исключены", потому что они не существуют с момента его создания и создания и до конца программы.

Ничто из этого не противоречит тому, что вы написали / поняли во втором абзаце, хотя могут быть нюансы в зависимости от языка программирования, о котором вы говорите.


То, что вы нашли, является плохо сформулированным определением static. Ни больше, ни меньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...