Отключил сборку мусора, а его всё равно кто-то собирает...
Пользователь
Сообщений: Регистрация: 27.12.2022
07.05.2024 11:08:11
В main написал: collectgarbage('stop'), но при присваивании нового значения длинной строке в окне скриптов вижу, как занимаемая этим скриптом память сразу сильно уменьшается. Как это объясняется?
Пользователь
Сообщений: Регистрация: 02.02.2015
миру мир!
08.05.2024 12:46:12
Так это высвобождение системной памяти, занимаемой длинной строкой. Сборщик мусора тут ни при чем
Пользователь
Сообщений: Регистрация: 27.12.2022
08.05.2024 15:32:27
А разве не сборщик мусора вызывает Win API free(...) в т.ч. для строк?
Пользователь
Сообщений: Регистрация: 27.12.2022
08.05.2024 15:44:54
Вы имели в виду, что, когда я длинной строке присваиваю "", то она сразу удаляется (вызывается free()), минуя сборщик мусора, и пересоздаётся (c выделением 56 байтов через malloc())?
Пользователь
Сообщений: Регистрация: 02.02.2015
миру мир!
08.05.2024 16:14:19
Сборщик мусора удаляет не используемые переменные Lua Если же присваивать строку разной длины одной переменной - то разумеется память сразу захватывается/освобождается. Иначе никакой памяти не напасешься
Пользователь
Сообщений: Регистрация: 27.12.2022
08.05.2024 17:27:45
Спасибо, теперь ясно, почему память под скрипт уменьшалась.
А если короткой строке что-то присвоить, то алгоритм сложнее: она, как я заметил, заносится в стринг буфер, и если какой-то строке присваивается короткое значение, то в этом стринг буфере ищется по хэшу такая же строка и, если найдена, оживляется, а если такая строка не находится, то тогда создаётся новая.