Spec-Zone.ru › Nim

Управление памятью в Nim

"Путь в ад вымощен благими намерениями."

Стратегии управления памятью в многопарадигменном подходе

Nim предлагает несколько различных стратегий управления памятью. Для выбора стратегии управления памятью используйте переключатель --mm:.

Подсказка: Рекомендуемый переключатель для нового кода Nim — `--mm:orc`.

ARC/ORC

ORC — это стратегия управления памятью по умолчанию. Это режим управления памятью, основанный в основном на подсчёте ссылок. Циклы ссылок обрабатываются механизмом сбора циклов, основанным на «испытательном удалении». Поскольку алгоритмы, основанные на «прослеживании», не используются, поведение во время выполнения не зависит от размеров кучи и стека.

Операции подсчёта ссылок (= «операции RC») не используют атомарные инструкции и не должны — вместо этого целые подграфы перемещаются между потоками. Компилятор Nim также агрессивно оптимизирует операции RC и использует семантику перемещения.

Nim выполняет ряд оптимизаций для ARC/ORC; вы можете проверить, что он сделал с вашей критически важной для времени функцией, с помощью --expandArc:functionName. Аналогично, вы можете проверить весь модуль с помощью --expandArc:fileName.

--mm:arc использует тот же механизм, что и --mm:orc, но опускает коллектор циклов. И ARC, и ORC предлагают детерминированную производительность для систем с жёстким реальным временем, но ARC может быть проще для понимания для людей, приходящих из Ada/C++/C — грубо говоря, память для переменной освобождается, когда она выходит «из области видимости».

Мы обычно рекомендуем вам использовать аннотацию acyclic, чтобы оптимизировать накладные расходы коллектора циклов, но --mm:orc также генерирует больше машинного кода, чем --mm:arc, поэтому, если на целевой платформе важен размер кода, и вы знаете, что ваш код не генерирует циклы, вы можете использовать --mm:arc. Обратите внимание, что реализация асинхронного кода по умолчанию создает циклы и приводит к утечке памяти с помощью --mm:arc, другими словами, для async вам нужно использовать --mm:orc.

Другие режимы MM

Примечание: Сборщик мусора refc инкрементальный, локальный для потока и не «останавливает мир».
--mm:refc
Это отложенный сборщик мусора на основе подсчёта ссылок с резервным сборщиком мусора Mark&Sweep для сбора циклов. Кучи локальны для потока. Этот документ содержит дополнительную информацию.
--mm:markAndSweep
Простой сборщик мусора на основе Mark-And-Sweep. Кучи локальны для потока.
--mm:boehm
Сборщик мусора на основе Boehm, он предлагает общую кучу.
--mm:go
Сборщик мусора Go, полезный для взаимодействия с Go. Предлагает общую кучу.
--mm:none
Никакой стратегии управления памятью и никакого сборщика мусора. Выделенная память просто никогда не освобождается. Вместо этого используйте --mm:arc.

Ниже приведён сравнительный анализ различных режимов управления памятью:

Управление памятью Куча Циклы ссылок Остановка мира Атомарный Совместимость с Valgrind Переключатель командной строки
ORC Общая Коллектор циклов Нет Нет Да --mm:orc
ARC Общая Утечка Нет Нет Да --mm:arc
Атомарный ARC Общая Утечка Нет Да Да --mm:atomicArc
RefC Локальная Коллектор циклов Нет Нет Нет --mm:refc
Mark & Sweep Локальная Коллектор циклов Нет Нет Нет --mm:markAndSweep
Boehm Общая Коллектор циклов Да Нет Нет --mm:boehm
Go Общая Коллектор циклов Да Нет Нет --mm:go
None Ручное Ручное Ручное Ручное Ручное --mm:none

Сборщик мусора JavaScript используется для целей компиляции JavaScript и NodeJS. Цель NimScript использует стратегию управления памятью, встроенную в компилятор Nim.

© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/mm.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API