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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top