2011-01-10 2 views
1

Маркированные указатели являются общей оптимизацией при реализации динамических языков: используйте требования к выравниванию, которые означают, что низкие два или три бита указателя всегда равны нулю и используют их для хранения информации о типе.Boehm и тегированные указатели

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

Это шоу-стоппер, т. Е. У вас есть, чтобы использовать помеченные указатели, если вы используете Boehm? Или у него есть путь вокруг этой проблемы?

+0

Зачем использовать Boehm для реализации языка? Если вы достаточно продвинуты, чтобы подумать о сохранении нескольких бит информации о типе, вы можете, конечно, написать GC с ручной настройкой, который не подходит для этого и является более умным, чем Boehm для вашего языка? Правильно? – delnan

+1

В принципе возможно, но в краткосрочной перспективе нетривиальнее делать лучше, чем Boehm (обратите внимание, что, например, Mono использовала его до недавнего времени), и в долгосрочной перспективе я нацелен на интероперабельность с C (в каком сценарии Boehm, возможно, является почти оптимальным решение). – rwallace

ответ

2

AFAIK Boehm может справиться с этим с правильными параметрами. Он способен, по небольшой цене, обнаруживать внутренние указатели. Также можно написать собственный код сканирования. В основном, вероятно, достаточно крючков для обработки практически всего.

Я написал свой собственный коллекционер, он точно на куче и консервативен в стеке. Он не касается C-указателей. Для некоторых приложений это будет быстрее, потому что он знает много о моих выделенных языками объектах и ​​не заботится о других материалах, которые управляются, скажем, с использованием традиционных деструкторов C++.

Однако он не является инкрементальным или генераторным, и он также не обрабатывает потоки (он недостаточно умен, чтобы остановить потоки с сигналами). Однако с плюсом стороны не нуждаются в методах магической привязки, которые делает Boehm (для захвата mallocs и т. Д.). На серьезной минусовой стороне вы не можете переместить управляемые объекты в неуправляемые.

Смежные вопросы