Come dire ad un un compilatore C ++ o C che i puntatori non sono alias
-
27-10-2019 - |
Domanda
Non ho funzione che riceve un array di puntatori in questo modo:
void foo(int *ptrs[], int num, int size)
{
/* The body is an example only */
for (int i = 0; i < size; ++i) {
for (int j = 0; j < num-1; ++j)
ptrs[num-1][i] += ptrs[j][i];
}
}
Quello che voglio trasmettere al compilatore è che i puntatori ptrs[i]
non sono gli alias di ogni altra e che le matrici ptrs[i]
non si sovrappongono. Come farò a fare questo? Il mio secondo fine è quello di incoraggiare vettorializzazione automatica.
Inoltre, c'è un modo per ottenere lo stesso effetto di __restrict__
su un iteratore di un std::vector
?
Soluzione
restrict
, a differenza del const
più comune, è una proprietà del puntatore , piuttosto che il Dati indicò . Appartiene quindi sul destro lato del dichiaratore-modificatore '*
'. []
in una dichiarazione parametro è un altro modo per *
scrittura. Mettendo insieme queste cose, si dovrebbe essere in grado di ottenere l'effetto che si vuole con questo prototipo di funzione:
void foo(int *restrict *restrict ptrs, int num, int size)
{
/* body */
}
e senza bisogno di nuovi nomi. (Non testato. La vostra situazione potrebbe essere diversa. restrict
è un suggerimento di ottimizzazione pura e non può effettivamente fare qualcosa di costruttivo con il compilatore.)
Altri suggerimenti
Qualcosa di simile:
void foo(int *ptrs[], int num, int size)
{
/* The body is an example only */
for (int i = 0; i < size; ++i) {
for (int j = 0; j < num-1; ++j) {
int * restrict a = ptrs[num-1];
int * restrict b = ptrs[j];
a[i] += b[i];
}
}
... dovrebbe farlo, credo, in C99. Non credo che ci sia alcun modo in C ++, ma molti compilatori C ++ anche sostengo limitare.
In C ++, argomenti puntatore viene assunto non alias se essi indicano fondamentalmente diversi tipi (regole "rigorosa aliasing").
Nel C99, il "limitare" specifica chiave che un argomento puntatore non fa alias qualsiasi altro argomento puntatore.