Pointer tagging: как рантаймы прячут данные прямо внутри указателя
В x86-64 Linux пользовательские процессы обычно используют не все 64 бита адреса. На практике адреса занимают около 48 бит, а верхние биты часто остаются свободными.
И вот тут начинается низкоуровневая магия.
Некоторые рантаймы кладут в эти верхние биты служебную информацию: тип объекта, флаги, состояние GC, короткий идентификатор или другой metadata-tag. Перед разыменованием указатель очищается маской, и процессор снова видит обычный валидный адрес.
Это называется pointer tagging.
Зачем это нужно:
- можно хранить метаданные без отдельной структуры
- меньше аллокаций
- лучше cache locality
- быстрее проверка типа или состояния объекта
- меньше overhead в рантайме
Такой подход используют Lisp-рантаймы, garbage collectors, JavaScript-движки и VM, где каждый байт и каждый лишний переход по памяти имеют значение.
Идея простая: если часть битов в указателе всё равно не участвует в адресации, почему бы не заставить их работать.
Post #2214
3.22K

- 👍 4