Restrict: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
→Ottimizzazione: più chiaro |
m Bot: numeri di pagina nei template citazione |
||
(6 versioni intermedie di 6 utenti non mostrate) | |||
Riga 1:
{{titolo minuscolo}}
La [[parola chiave (informatica)|parola chiave]] <code>restrict</code> è usata nel
Tale informazione consente al compilatore di generare codice meglio ottimizzato: in principio, l'aggiunta di <code>restrict</code> allo standard C consente di colmare il divario rispetto a [[Fortran]] in applicazioni di [[calcolo numerico]].<ref name=drepper>{{
Lo standard del linguaggio [[C++]] non prevede la parola chiave <code>restrict</code>, ma molti compilatori implementano una parola chiave non-standard che fornisce un effetto analogo alla controparte in C, ad esempio <code>__restrict__</code> in [[GNU Compiler Collection|GCC]]<ref>{{cita web|url=https://gcc.gnu.org/onlinedocs/gcc/Restricted-Pointers.html|titolo=Using the GNU Compiler Collection: Restricted Pointers}}</ref> o <code>__restrict</code> e <code>__declspec(restrict)</code> in [[Visual C++]].<ref>{{cita web|url=https://msdn.microsoft.com/it-it/library/5ft82fed.aspx|titolo=__restrict}}</ref>
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
<
movq (%rdx), %rax
addq %rax, (%rdi)
addq %rax, (%rsi)
ret
</syntaxhighlight>
== Note ==
Riga 45:
== Bibliografia ==
*{{Cita pubblicazione|url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf▼
▲|url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
▲|title=ISO/IEC 9899:TC2 Committee Draft
|data=6 maggio 2005
▲|publisher=[[International Organization for Standardization|ISO]]
|accesso=22 dicembre 2008
|pp=108-112
}}
== Collegamenti esterni ==
* [https://web.archive.org/web/20080619120934/http://www.cellperformance.com/mike_acton/2006/05/demystifying_the_restrict_keyw.html Demystifying The Restrict Keyword]: explanation and examples of use
* {{
* [http://www.lysator.liu.se/c/restrict.html Restricted Pointers in C]: the original rationale behind the definition
{{portale|informatica}}
|