restrict

Específicos de Microsoft

Cuando se aplica a una declaración de función o a una definición que devuelve un tipo de puntero, restrict indica al compilador que la función devuelve un objeto que no tiene alias, es decir, que no hace referencia a él ningún otro puntero. Esto permite al compilador realizar optimizaciones adicionales.

Sintaxis

__declspec(restrict)pointer_return_typefunction();

Comentarios

El compilador propaga __declspec(restrict). Por ejemplo, la función malloc de CRT tiene una decoración __declspec(restrict) y, por lo tanto, el compilador supone que los punteros que malloc inicializa en ubicaciones de memoria tampoco tienen alias de punteros existentes anteriormente.

El compilador no comprueba que el puntero devuelto realmente no tenga alias. Es responsabilidad del programador garantizar que el programa no use un alias de un puntero marcado con el modificador restrict __declspec.

Para conocer la semántica similar en las variables, consulte __restrict.

Para obtener otra anotación que se aplica al alias dentro de una función, consulte __declspec(noalias).

Para obtener información sobre la palabra clave restrict que forma parte de C++ AMP, consulte restrict (C++ AMP).

Ejemplo

En el ejemplo siguiente se muestra el uso de __declspec(restrict).

Cuando __declspec(restrict) se aplica a una función que devuelve un puntero, esto indica al compilador que la memoria a la que apunta el valor devuelto no tiene alias. En este ejemplo, los punteros mempool y memptr son globales, por lo que el compilador no puede estar seguro de que la memoria a la que hacen referencia no tiene alias. Aun así, se usan en ma y su llamador init de una manera que devuelve la memoria a la que el programa no hace referencia de otro modo, por lo que __decslpec(restrict) se usa para ayudar al optimizador. Esto es similar a la forma en que los encabezados de CRT decoran funciones de asignación como malloc mediante __declspec(restrict) para indicar que siempre devuelven memoria que no puede tener alias de punteros existentes.

// declspec_restrict.c
// Compile with: cl /W4 declspec_restrict.c
#include <stdio.h>
#include <stdlib.h>

#define M 800
#define N 600
#define P 700

float * mempool, * memptr;

__declspec(restrict) float * ma(int size)
{
    float * retval;
    retval = memptr;
    memptr += size;
    return retval;
}

__declspec(restrict) float * init(int m, int n)
{
    float * a;
    int i, j;
    int k=1;

    a = ma(m * n);
    if (!a) exit(1);
    for (i=0; i<m; i++)
        for (j=0; j<n; j++)
            a[i*n+j] = 0.1f/k++;
    return a;
}

void multiply(float * a, float * b, float * c)
{
    int i, j, k;

    for (j=0; j<P; j++)
        for (i=0; i<M; i++)
            for (k=0; k<N; k++)
                c[i * P + j] =
                          a[i * N + k] *
                          b[k * P + j];
}

int main()
{
    float * a, * b, * c;

    mempool = (float *) malloc(sizeof(float) * (M*N + N*P + M*P));

    if (!mempool)
    {
        puts("ERROR: Malloc returned null");
        exit(1);
    }

    memptr = mempool;
    a = init(M, N);
    b = init(N, P);
    c = init(M, P);

    multiply(a, b, c);
}

FIN de Específicos de Microsoft

Consulte también

Palabras clave
__declspec
__declspec(noalias)