Я работаю во Flash и пытаюсь использовать новую «память домена», доступную во Flash Player. По сути, это позволяет вам работать с памятью на низком уровне, но вы должны сами управлять памятью, подобно C ++, в котором нет встроенного сборщика мусора. Я построил базовый распределитель / освобождающий модуль, но мне нужен какой-то способ создания сборщика мусора или счетчика ссылок, чтобы можно было нераспределять неиспользуемые объекты. Возьмите следующий пример:
Rect stageRect = new Rect(0, 0, stage.width, stage.height);
// syntax is for understanding only
// actually would allocate memory using my handwritten allocator
Я построил новый Rect
и хранится в классе var. Теперь допустим, что я выполнил некоторую прямоугольную математику для этого объекта, создав еще 2 объекта.
Rect quarterRect = stageRect.halfWidth().halfHeight();
Как видите, Rect
вернулся halfWidth
не используется, и может быть мусором.
Последний прямоугольник, созданный halfHeight
хранится в var quarterRect
, что мне нужно на потом.
Как я могу обнаружить такие неиспользуемые объекты и утилизировать их соответствующим образом? Я читал на Подсчет ссылок, умные указатели, GC для C ++, но я все еще не могу понять, как определить, когда ссылка не используется, чтобы уменьшить счетчик ссылок. Увеличивать счетчик ссылок легко: когда вы устанавливаете другую переменную для указания на этот объект, то есть: a = stageRect
, должен увеличить счетчик ссылок stageRect
но как бы ты узнал когда a
не используется? уменьшить счетчик ссылок? Обычно вы не ходите вокруг настройки a = null
в современном коде. Вы просто ожидаете, что платформа обнаружит неиспользованную ссылку и утилизирует ее.
Что ж, давайте рассмотрим этот код:
int someFunction() { // I have no clue about AS3 syntax, but I suppose it's C-like, right?
Rect a = new Rect(...); // there are no pointers, only references, right?
// ... some other stuff
} // <- what happens here?
Что происходит при закрывающей фигурной скобке? a
Переменная выходит из области видимости. В C ++, когда переменная выходит из области видимости, вызывается ее деструктор. Что происходит в AS3, когда переменная выходит из области видимости? Если здесь ничего не происходит, ничего, что вы можете отследить программно … ну, тогда я боюсь, что реализация подсчета ссылок невозможна. Для подсчета ссылок вам нужен способ сообщить, что ссылка на ваше значение исчезла.
Но у AS3 действительно нет GC? Я не могу поверить в языки сценариев без GC.
Других решений пока нет …