In informatica l'indirezione (detta anche riferimento indiretto) è la tecnica che consente di indicare un oggetto o un valore mediante un suo riferimento invece che direttamente. Il termine viene utilizzato frequentemente nei linguaggi di programmazione per indicare l'uso dei puntatori.
Teoria
[modifica | modifica wikitesto]La forma più semplice e comune di indirezione avviene ogniqualvolta un processore accede ad una memoria. Le memorie sono solitamente organizzate in una sequenza di celle, ciascuna delle quali contiene un valore (una sequenza di bit), accessibile mediante il proprio indirizzo.
Quando il processore richiede il contenuto di una cella di memoria ne fornisce l'indirizzo alla memoria (1002 nell'esempio), che ne restituisce il valore (17 in questo caso). L'operazione di sostituzione dell'indirizzo per il contenuto effettuata dalla memoria è l'esempio più semplice di indirezione.
Un esempio più complesso di indirezione è quello relativo al metodo di indirizzamento indiretto. In questo caso il contenuto della cella di memoria non è direttamente il valore voluto, ma è solo il suo indirizzo; sarà necessario accedere una seconda volta alla memoria per ottenere il dato desiderato.
Sempre dall'esempio a lato, se il microprocessore facesse un indirizzamento indiretto alla locazione numero 1003, eseguirebbe in sequenza questi due passi:
- accedendo alla cella 1003 troverebbe immediatamente il valore 1001 (risultato intermedio);
- accedendo alla cella 1001 otterrebbe infine il valore 610 (risultato finale).
Questo tipologia di indirizzamento richiede più tempo per essere eseguita, dato che necessita di due accessi distinti alla memoria; per questa ragione è stata eliminata dai processori in architettura RISC, nei quali i passi indicati sopra devono essere scritti esplicitamente. Un esempio in linguaggio assemblatore:
Processore CISC | Processore RISC |
---|---|
mov R0, (1003) | mov R0, 1003 mov R0, (R0) |
Nella sua accezione più comune il termine indirezione si riferisce all'utilizzo di puntatori, che sono l'equivalente dell'indirizzamento indiretto in un linguaggio di programmazione ad alto livello. In questi linguaggi, gli indirizzi di memoria sono indicati mediante nomi simbolici detti variabili, ed il termine puntatore viene utilizzato per indicare una variabile (una cella di memoria) destinata a contenere un indirizzo invece di un valore.
Il formalismo utilizzato per indicare l'operazione di indirezione dipende dal linguaggio utilizzato. Ad esempio nel linguaggio c viene utilizzata la notazione *NomeVariabile per indicare l'accesso alla locazione il cui indirizzo è contenuto nella cella di memoria denominata NomeVariabile.
In questo contesto l'operazione inversa a quella di indirezione è denominata AddressOf (trad. indirizzo di), e consiste nell'ottenere l'indirizzo di memoria di una variabile dato il suo nome. Nel linguaggio c questa operazione è rappresentata dal simbolo &.
I linguaggi di programmazione orientati agli oggetti tendono a mascherare al programmatore l'utilizzo dei puntatori e dell'indirezione, pur utilizzandoli estensivamente al loro interno. A tutti gli effetti ciascun oggetto dichiarato o utilizzato in questi linguaggi viene acceduto mediante l'operazione di indirezione, consentendo di ottenere in tal modo il loro polimorfismo.