Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТЯП, ТВП / ТЯПМТ / Пособие.doc
Скачиваний:
161
Добавлен:
11.05.2015
Размер:
2.37 Mб
Скачать

8.5. Счетчик ссылок

При использовании счетчика ссылок память восстанавливается сразу после того, как она оказывается недоступной для программы. Куча рассматривается как последовательность ячеек, в каждой из которых содержится невидимое для программиста поле (счетчик ссылок), в котором ведется счет числа других ячеек или значений в стеке, указывающих на эту ячейку. Счетчики ссылок обновляются во время выполнения программы, и когда значение конкретного счетчика становится нулем, соответствующий объем памяти можно восстанавливать.

Для простоты допустим, что в каждой ячейке есть три поля, первое из которых отводится для счетчика ссылок. Если Х– идентификатор, указывающий на список, то его значение может быть представлено

X

1

A

1

B

1

C

Результат присвоения Y-кувторого элемента списка («хвоста»Х)

X

1

A

2

B

1

C

Y

Результат следующего присвоения

X

0

A

1

B

1

C

Y

На единицу уменьшился не только счетчик ссылок ячейки, на которую указывает Х, но и ячейка, на которую указывает данная ячейка.

Алгоритм уменьшения счетчика ссылок после присвоения формулируется следующим образом: уменьшить на единицу счетчик ссылок ячейки, на которую указывал идентификатор правой части присвоения; если счетчик ссылок является теперь нулем, следовать всем указателям этой ячейки, уменьшая счетчики ссылок до тех пор, пока (для каждого пути) не будет получено нулевое значениеили достигнут конец пути.

Поскольку нельзя следовать параллельно по двум или более путям, то потребуется стек для хранения в нем указателей, которым нужно еще следовать.

Счетчики ссылок в действительности нет необходимости хранить в самих ячейках. Их можно хранить где-нибудь в другом месте, лишь бы соблюдалось полное соответствие между адресом ячейки и его счетчиком ссылок.

Основными недостатками организации такого регулирования памяти являются:

  1. Память, выделяемая для определенных структур, не восстанавливается с помощью описанного алгоритма, даже, если не будет доступа ни к одному из объемов памяти. Это четко видно на примере циклического списка (рис 8.10).

1

A

1

B

C

1

Рис. 8.10. Циклический список

Ни один из его счетчиков не является нулем, хотя никакие указатели на него извне не указывают. Этот объем памяти не восстановится никогда;

  1. Обновление счетчиков ссылок представляет собой значительную нагрузку для всех программ. Это противоречит принципу Бауэра – «простые программы не должны расплачиваться за дорогостоящие языковые средства, которыми не пользуются».