Похоже, что реализация слабых ссылок - это секрет в отрасли ;-). Например, на данный момент в статье Википедии отсутствуют какие-либо подробности реализации. И посмотрите на ответы выше (включая принятые): «иди посмотри на источник» или «я думаю»; - \.
Из всех ответов проницательный только тот, который ссылается на PEP 205 Python. Как говорится, для любого отдельного объекта может быть не более одной слабой ссылки, если мы будем рассматривать слабую ссылку как саму сущность.
Остальное описывает реализацию языка Squirrel. Таким образом, weakref сам по себе является объектом, когда вы помещаете слабую ссылку на объект в некоторый контейнер, вы фактически помещаете ссылку на объект слабой ссылки. Каждый ref-counttable объект имеет поле для хранения указателя на его слабую ссылку, которая равна NULL до тех пор, пока не будет фактически запрошена слабая ссылка на этот объект. У каждого объекта есть метод для запроса слабого ссылки, который либо возвращает существующее (одноэлементное) слабое отражение из поля, либо создает его и кэширует в поле.
Конечно, слабая ссылка указывает на исходный объект. Итак, вам просто нужно пройти через все доступные места, где обрабатываются ссылки на объекты, и добавить прозрачную обработку слабых ссылок (то есть автоматически разыменовывать их). («Прозрачная» альтернатива - добавить виртуальный метод «доступа», который будет идентичностью для большинства объектов и фактической разыменовкой для слабой ссылки.)
И поскольку у объекта есть указатель на его слабую ссылку, тогда объект может обнулять слабую ссылку в собственном деструкторе.
Эта реализация довольно чистая (без волшебных «вызовов в GC» и т. Д.) И имеет O (1) стоимость времени выполнения. Конечно, это довольно жадная память - нужно добавить +1 поле указателя к каждому объекту, хотя обычно для 90 +% объектов это будет NULL. Конечно, VHLL уже имеют большие накладные расходы памяти на объект, и может быть шанс сжать различные «дополнительные» поля. Например, тип объекта обычно представляет собой небольшое перечисление, поэтому может быть возможным объединить тип и некоторую ссылку со слабой ссылкой в одно машинное слово (скажем, хранить объекты со слабой ссылкой в отдельной области и использовать для этого индекс).