restrict

Específicos de Microsoft

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

Sintaxis

__declspec(restrict)__declspec(restrict)función ();

Comentarios

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

El compilador no comprueba que el puntero devuelto no esté realmente con alias. Es responsabilidad del desarrollador asegurarse de que el programa no usa el alias de un puntero marcado con el modificador restrict __declspec.

Para obtener una semántica similar en las variables, vea __restrict.

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

Para obtener información sobre la palabra clave que forma parte restrict de C++ AMP, vea restrict

Ejemplo

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

Cuando se aplica a una función que devuelve un puntero, indica al compilador que la memoria a la que apunta el __declspec(restrict) valor devuelto no tiene alias. En este ejemplo, los punteros y son globales, por lo que el compilador no puede estar seguro de que la memoria a la que hacen referencia mempoolmemptr no tenga alias. Sin embargo, se usan dentro de y su llamador de forma que devuelve memoria a la que el programa no hace referencia de otro modo, por lo que mainitma se usa para ayudar al optimizador. Esto es similar a cómo los encabezados de CRT decoran las funciones de asignación, como mediante para indicar que siempre devuelven memoria que no se puede asignar a los malloc__declspec(restrict) 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

Vea también

Palabras clave
__declspec
__declspec(noalias)