Модуль Ephemeron
module Ephemeron: sig .. end
Эфемеронные и слабые хэш-таблицы.
Эфемеронные и слабые хэш-таблицы полезны, когда требуется кэшировать или запоминать результат вычисления функции, при условии, что аргументы и сама функция используются, не создавая утечек памяти, постоянно сохраняя старые результаты вычислений, которые больше не нужны, потому что один из аргументов или функция освобождены. Реализация с использованием Hashtbl.t не подходит, потому что все ассоциации будут сохранять аргументы и результат в памяти.
Эфемеронные объекты также могут использоваться для «добавления» поля к произвольному упакованному значению OCaml: вы можете прикрепить некоторую информацию к значению, созданному внешней библиотекой, без утечек памяти.
Эфемеронные объекты хранят некоторые ключи и одно или ни одного данных. Все они являются упакованными значениями OCaml. Ключи эфемерона ведут себя как слабые указатели в соответствии с сборщиком мусора. Фактически, слабые указатели OCaml реализуются как эфемеронные объекты без данных.
Ключи и данные эфемерона называются полными, если они указывают на значение, или пустыми, если значение никогда не было установлено, было удалено или было удалено сборщиком мусора. В функции, которая получает доступ к ключам или данным, эти два состояния представлены типом option.
Данные считаются сборщиком мусора живыми, если все полные ключи живые и если эфемерон жив. Когда один из ключей больше не считается живым сборщиком мусора, данные освобождаются из эфемерона. Данные могут быть живыми по другой причине, и в этом случае сборщик мусора не освободит их, но эфемерон больше не будет содержать данных.
Эфемеронные объекты усложняют понятие жизнеспособности значений, поскольку оно больше не эквивалентно достижимости из корневого значения обычными указателями (не слабыми и не эфемеронными). С эфемеронными объектами понятие жизнеспособности строится с помощью наименьшей фиксированной точки: значение является живым, если:
- это корневое значение
- оно достижимо из живого значения с помощью обычных указателей
- это данные живого эфемерона со всеми его полными ключами, которые живы
Примечания:
- Все типы, определенные в этом модуле, не могут быть сериализованы с помощью
output_valueили функций модуляMarshal.
Эфемеронные объекты определены в этой статье с независимым от языка способом: B. Hayes, Эфемеронные объекты: новый механизм финализации, OOPSLA'97
- Since 4.03.0
module type S = sig .. end
Подпись вывода функторов Ephemeron.K1.Make и Ephemeron.K2.Make.
module type SeededS = sig .. end
Подпись вывода функторов Ephemeron.K1.MakeSeeded и Ephemeron.K2.MakeSeeded.
module K1: sig .. end
Эфемеронные объекты с одним ключом.
module K2: sig .. end
Эфемеронные объекты с двумя ключами.
module Kn: sig .. end
Эфемеронные объекты с произвольным количеством ключей одного типа.
module GenHashTable: sig .. end
Хэш-таблицы на универсальных контейнерах с понятием смерти и жизнеспособности.
© 1995-2022 INRIA.
https://v2.ocaml.org/releases/4.14/htmlman/libref/Ephemeron.html