Restrict: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m Bot: specificità dei wikilink |
m →Ottimizzazione: tag source deprecati, replaced: <source lang= → <syntaxhighlight lang= (4), </source> → </syntaxhighlight> (4) |
||
Riga 9:
Se il compilatore è certo che solo un puntatore può accedere ad un blocco di memoria, è possibile generare codice meglio ottimizzato, ad esempio modificando l'ordine delle istruzioni per eseguire tutte le operazioni di <code>load</code> o <code>store</code> consecutivamente, oppure evitando di caricare più volte uno stesso valore (sapendo che non può essere modificato tramite un altro puntatore <code>restrict</code>). Ad esempio, data la funzione
<
void updatePtrs(size_t *ptrA, size_t *ptrB, size_t *val)
{
Riga 15:
*ptrB += *val;
}
</syntaxhighlight>
i puntatori <code>ptrA</code>, <code>ptrB</code>, e <code>val</code> potrebbero accedere ad una stessa regione di memoria ([[pointer aliasing]]), per cui il compilatore deve tenere conto di questa possibilità nel generare il codice macchina. Ad esempio, <code>gcc -O3 -S</code> (usando [[GNU Compiler Collection|gcc]] versione 8.2) genera il seguente [[assembly]] [[x86-64]] per il corpo della funzione
<
movq (%rdx), %rax
addq %rax, (%rdi)
Riga 24:
addq %rax, (%rsi)
ret
</syntaxhighlight>
Se l'aliasing è escluso, qualificando i puntatori come <code>restrict</code> nella dichiarazione
<
void updatePtrs(size_t * restrict ptrA, size_t * restrict ptrB, size_t * restrict val);
</syntaxhighlight>
il compilatore può legittimamente assumere che <code>ptrA</code>, <code>ptrB</code>, e <code>val</code> accederanno sempre a regioni di memoria non sovrapposte e operazioni eseguite tramite un puntatore non avranno effetto sugli oggetti riferiti da altri puntatori (è comunque responsablità del programmatore di garantire questo fatto nella scrittura del codice). Questo rende superfluo leggere nuovamente il valore puntato da <code>val</code> dopo aver eseguito la prima istruzione, e l'assembly diventa
<
movq (%rdx), %rax
addq %rax, (%rdi)
addq %rax, (%rsi)
ret
</syntaxhighlight>
== Note ==
|