Видимость и время жизни объектов
Где находятся
данные объекта и как регулируется
время жизни объекта?
Существуют различные
философии,
работающие
в этой области.
C++ использует
подход, который эффективен
при управлении
для большинства
важных свойств, так что
программист
имеет выбор. Для
максимальной
скорости
выполнения
хранение
и время жизни может определяться
при написании
программы,
помещая объекты в стек (они иногда называется
автоматические
или контекстные
переменные)
или в области
статического
хранения.
Это дает приоритет
скорости
резервирования
и освобождения
хранимого
и управление
этим может
быть очень
драгоценно
в некоторых
ситуациях.
Однако вы приносите
в жертву гибкость, поскольку
вы должны
знать точное количество,
время жизни и тип объекта
при написании
программы.
Если вы
пробуете
более общую проблему,
такую как вспомогательный
компьютерный
дизайн, управление
складом или управление
воздушным
движением,
это большое
ограничение.
Второй способ - создания объектов
динамически
в области
памяти, называемой
кучей.
В этом
способе вы не знаете до выполнения,
сколько объектов необходимо,
какого их время
жизни или какой
их точный
тип. Это
определяется
в момент выполнения
программы.
Если вам
необходим
новый объект, вы просто
создаете
его в куче
в тот момент,
когда вам это
необходимо.
Поскольку хранилище
управляется
динамически
во время
выполнения,
количество
времени, необходимое
для резервации
места в куче значительно
больше, чем при
реализации
хранения
в стеке. (Создание хранилища
в стеке часто - это
простая инструкция
перемещения
указателя
стека вниз, а другая
инструкция
- перемещение
вверх.)
Динамический способ создания делает общие логические
присвоения,
через которые выражается
объект, так что
чрезмерные
затраты при нахождении
хранилища
и его освобождении
не будет
иметь значительное
влияние на создание
объекта. Вдобавок, большая гибкость существенна
для решения
общих проблем программирования.
Java использует
исключительно
второй способ . Каждый
раз, когда
вы хотите
создать объект, вы используете
ключевое
слово new для создания динамического
экземпляра
этого объекта.
Однако есть другая
способность
- это время жизни
объекта.
С языками,
которые позволяют
объектам
создаваться
в стеке, компилятор
определяет,
как велик
объект и когда он
может быть автоматически
разрушен.
Однако если вы
создаете
его в куче,
компилятор
не имеет
знаний о его времени
жизни. В таких языках,
как C++, вы
должны определить
программированием,
когда разрушать
объект, который может вызвать
утечку памяти, если вы
некорректно
сделаете
это (и это
общая проблема программ на C++).
Java обеспечивает
особенность,
называемую
сборщиком
мусора, который автоматически
определяет,
когда объект более не
используется
и разрушает
его.
{
{
int n = 3;
String s = „Tere!“;
}
// переменные n и s «пропали»,
но строка „Tere!“
осталась в
куче – в виде
мусора!
}
Сборщик мусора часто более
пригодный,
так как
он уменьшает
число проблем, которые вы должны
отслеживать
и упрощает
код, который
вы должны
написать.
Более важно то,
что сборщик
мусора обеспечивает
достаточно
высокий уровень страховки
от сложной
проблемы
утечки памяти (которая заставляет
тормозиться
многие проекты на C++).
Упражнение. Когда сборщик
мусора готов освободить
хранилище,
используемое
вашим объектом, он сначала
вызовет finalize( ), а только
на следующем
этапе сборки мусора он освободит
память объекта. Так что,
если вы
выбрали использование
finalize( ), это
даст вам
возможность
выполнить
некоторые
важные для очистки
операции
во время
сборки мусора. С
другой
стороны, с
помощью
метода можно
узнать, в какой
ситуации
автоматически
запускается
сборщик
мусора.