Pregunta

Tengo una función que recibe una variedad de punteros como así:

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];
     }
}

Lo que quiero transmitir al compilador es que los punteros ptrs[i] no son alias el uno del otro y que las matrices ptrs[i] No se superponga. ¿Cómo haré esto? Mi motivo oculto es fomentar la vectorización automática.

Además, ¿hay alguna forma de obtener el mismo efecto que __restrict__ en un iterador de un std::vector ?

¿Fue útil?

Solución

restrict, a diferencia de los más comunes const, es una propiedad del puntero en lugar de el datos apuntados a. Por lo tanto, pertenece al Correcto lado del '*'Modificador del Declarador. [] En una declaración de parámetros es otra forma de escribir *. Al reunir estas cosas, debería poder obtener el efecto que desea con este prototipo de función:

void foo(int *restrict *restrict ptrs, int num, int size)
{
   /* body */
}

y no hay necesidad de nuevos nombres. (No probado. Su kilometraje puede variar. restrict es una pista de optimización pura y puede que en realidad no haga nada constructivo con su compilador).

Otros consejos

Algo como:

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];
     }
}

... debería hacerlo, creo, en C99. No creo que haya de ninguna manera en C ++, pero muchos compiladores de C ++ también admiten restricciones.

En C ++, se supone que los argumentos del puntero no son alias si señalan tipos fundamentalmente diferentes (reglas de "alias estrictas").

En C99, la palabra clave "restringir" especifica que un argumento de puntero no alias no es ningún otro argumento de puntero.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top