# Punter etiquetat

En informàtica, un punter etiquetat és un punter (concretament una adreça de memòria) amb dades addicionals associades, com ara un bit d'indirecció o un recompte de referència. Aquestes dades addicionals sovint es "pleguen" al punter, és a dir, s'emmagatzemen en línia a les dades que representen l'adreça, aprofitant certes propietats de l'adreçament de memòria. El nom prové dels sistemes d'" arquitectura etiquetada ", que reservaven bits a nivell de maquinari per indicar el significat de cada paraula; les dades addicionals s'anomenen "etiquetes" o "etiquetes", encara que en sentit estricte "etiquetes" es refereixen a dades que especifiquen un tipus, no altres dades; tanmateix, l'ús "punter etiquetat" és omnipresent.

## Plegat d'etiquetes al punter

Hi ha diverses tècniques per plegar etiquetes en un punter.
La majoria de les arquitectures són adreçables per bytes (la unitat adreçable més petita és un byte), però certs tipus de dades sovint s'alinearan amb la mida de les dades, sovint una paraula o múltiple d'aquestes. Aquesta discrepància deixa sense utilitzar alguns dels bits menys significatius del punter, que es poden utilitzar per a etiquetes, sovint com a camp de bits (cada bit una etiqueta separada), sempre que el codi que utilitza el punter emmascara aquests bits abans d'accedir. memòria. Per exemple, en una arquitectura de 32 bits (tant per a adreces com per a la mida de la paraula), una paraula té 32 bits = 4 bytes, de manera que les adreces alineades amb paraules són sempre múltiple de 4, per tant acaben en 00, deixant els últims 2 bits disponibles; mentre que en una arquitectura de 64 bits, una paraula té 64 bits = 8 bytes, de manera que les adreces alineades amb paraules acaben en 000, deixant els últims 3 bits disponibles. En els casos en què les dades s'alineen a un múltiple de la mida de la paraula, hi ha més bits disponibles. En el cas d'arquitectures adreçables a paraules, les dades alineades amb paraules no deixen cap bit disponible, ja que no hi ha discrepància entre l'alineació i l'adreçament, però sí les dades alineades amb un múltiple de la mida de la paraula.
Per contra, en alguns sistemes operatius, les adreces virtuals són més estretes que l'amplada total de l'arquitectura, la qual cosa deixa els bits més significatius disponibles per a les etiquetes; això es pot combinar amb la tècnica anterior en cas d'adreces alineades. Aquest és particularment el cas de les arquitectures de 64 bits, ja que els 64 bits d'espai d'adreces estan molt per sobre dels requisits de dades de totes les aplicacions excepte les més grans i, per tant, molts processadors pràctics de 64 bits tenen adreces més estretes. Tingueu en compte que l'amplada de l'adreça virtual pot ser més estreta que l'amplada de l'adreça física, que al seu torn pot ser més estreta que l'amplada de l'arquitectura; per a l'etiquetatge de punters a l'espai d'usuari, l'espai d'adreces virtuals proporcionat pel sistema operatiu (al seu torn proporcionat per la unitat de gestió de memòria) és l'amplada corresponent. De fet, alguns processadors prohibeixen específicament l'ús d'aquests punters etiquetats a nivell de processador, especialment x86-64, que requereix l'ús d'adreces de forma canònica per part del sistema operatiu, amb els bits més significatius tots 0s o tots 1s.
Finalment, el sistema de memòria virtual de la majoria dels sistemes operatius moderns reserva un bloc de memòria lògica al voltant de l'adreça 0 com a inutilitzable. Això vol dir que, per exemple, un punter a 0 no és mai un punter vàlid i es pot utilitzar com a valor especial de punter nul. A diferència de les tècniques esmentades anteriorment, això només permet un únic valor de punter especial, no dades addicionals per als punters en general.

## Exemples

Un dels primers exemples de suport de maquinari per a punters etiquetats en una plataforma comercial va ser l'IBM System/38. IBM més tard va afegir suport de punter etiquetat a l'arquitectura PowerPC per donar suport al sistema operatiu IBM i, que és una evolució de la plataforma System/38.
Un exemple significatiu de l'ús de punters etiquetats és el temps d'execució Objective-C a iOS 7 a ARM64, especialment utilitzat a l'iPhone 5S. A iOS 7, les adreces virtuals només contenen 33 bits d'informació d'adreces, però tenen 64 bits de llarg, deixant 31 bits per a les etiquetes. Els punters de classe Objective-C estan alineats a 8 bytes, alliberant 3 bits addicionals d'espai d'adreces, i els camps d'etiquetes s'utilitzen per a molts propòsits, com ara emmagatzemar un recompte de referència i si l'objecte té un destructor.
Les primeres versions de macOS utilitzaven adreces etiquetades anomenades Handles per emmagatzemar referències a objectes de dades. Els bits alts de l'adreça indicaven si l'objecte de dades estava bloquejat, purgable i/o originat a partir d'un fitxer de recursos, respectivament. Això va causar problemes de compatibilitat, quan l'adreçament de macOS va avançar de 24 bits a 32 bits al sistema 7.

## Referències

* ↑ «Tagged Pointers» (en anglès). [Consulta: 24 desembre 2023].
* ↑ Levy, Henry M. «The IBM System/38». A: Capability-Based Computer Systems (en anglès). Digital Press, 1984. ISBN 0-932376-22-3.
* ↑ Frank G. Soltis. Inside the AS/400, Second Edition (en anglès). Duke Press, 1997. ISBN 978-1882419661.
* ↑ Bricknell, K. J.. Macintosh C: A Hobbyist's Guide To Programming the Mac OS in C (en anglès).