arlean1 писал(а):
Если одновременно используется две системы - одна, где требуется сборка муссора, и другая , где требуется несколько или очень много циклов использования замкнутого компонента (контейнера)? У вас было упоминание на дне Оберона о вашей системе в этом аспекте - можно привести пример правильного использования, чтобы не было утечки памяти?
Ну смотрите, у вас 2 пути:
1) Мелкие объекты таки являются управляемыми (создаются через NEW в основной управляемой куче). Тогда просто нужны пулы, в которые вы их возвращаете - и из них же берёте. Тем самым у вас падает количество избыточно созданных и выброшенных (в ожидании сборки мусора) объектов. И можно вообще крайне редко выполнять сборку мусора (или вообще не выполнять, если у вас всё выделение сконцентрировано только в пулах - а ББ неграфический, без чужих компонентов, т.е. вы понимаете, где и что выделяется).
Минус - если сборка всё же выполняется, то при большом количестве мелких объектов пробег по ним сборщика занимает время.
2) Если объекты инкапсулированы в реализации и недоступны внешнему модулю, то можно сделать их через POINTER TO RECORD [untagged] и выделять и освобождать через malloc или WinApi.Heap... Разумеется, нужно строго выверить корректность выделения/освобождения внутри реализации вашего контейнера.
Если логика сложная, я бы без необходимости оптимизации не рисковал этим вообще, пусть гарантирует сборщик (по крайней мере, при выделении/освобождении в пул вы получите логическую ошибку одновременного использования объекта - и это можно подиагностировать, а при неверной работе с неуправляемой памяти у вас всё неуправляемо и сдохнет
).
Если логика простая (моменты выделения/освобождения ну прямо очевидны) - то игра стоит свеч, т.к. если мелких объектов внутри очень много, то и задержки они дают на сборку очень существенные.
Ещё есть такая штука, как POINTER [untagged] TO RECORD - такой указатель не трассируется сборщиком, но является теговым, т.е. можно иметь методы, полиморфизм, WITH и проч. Только за размещение тега в выделенном блоке отвечаете сами. Надо положить сначала тег типа, а потом взять за указатель +SIZE(POINTER) (чтобы тег остался по -4). Ну и освобождать с соответствующей логикой.
Это может быть важно, если внутри реализации вашей структуры вы таки используете ООП (подвиды листов дерева там, ну и т.п.)