Ho una conoscenza generale di restrict
ma spero di chiarire alcuni punti. Ho una funzione che legge una stringa con terminazione null da un buffer e scrive una versione con codifica URL in un altro buffer. La funzione ha questa firma (attualmente senza restrict
):Quando utilizzare limit e quando non su
char const *StringUrlEncode(char const *unencoded,
char *encoded,
char *encodedEnd);
unencoded
è la mia stringa di origine terminazione null. Il buffer di destinazione è rappresentata da encoded
e encodedEnd
, dove encoded
punta al primo char
nel buffer e encodedEnd
punti al primo carattere dopo il tampone, cioè la funzione scriverà char
s fino a ma esclusione la posizione indicata a da encodedEnd
- questa è la coppia di iteratori di base begin
/end
se si ha familiarità con le convenzioni STL di C++.
Se aggiungo restrict
a questa funzione, dovrebbe essere applicato solo per i primi due parametri:
char const *StringUrlEncode(char const *restrict unencoded,
char *restrict encoded,
char *encodedEnd);
o c'è qualche beneficio non ci sto capendo aggiungendolo a tutti e tre i parametri?
Vedo che rendere i buffer di input e output restrict
aiuta il compilatore a sapere che non si sovrappongono. Ma dato che l'ultimo parametro, encodedEnd
, è usato solo per segnare la fine del buffer di output, penso che lo restrict
non sarebbe di alcun aiuto per il compilatore qui (anche se presumo che non danneggerebbe, oltre all'aggiunta rumore inutile alla dichiarazione di funzione).
Ho letto l'articolo di Mike (due volte) ed è un buon inizio, ma mi ha lasciato alcune domande :-) –
Il collegamento fornito non è funzionale. Google suggerisce che è disponibile una versione aggiornata all'indirizzo http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html (convalidato dal 2009-09-06), ma anche questo sta dando problemi. La versione cache è disponibile su Google. –