restrictrestrict

Específicos de MicrosoftMicrosoft Specific

Cuando se aplica a una declaración o definición de funció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 hace referencia a otro puntero.When applied to a function declaration or definition that returns a pointer type, restrict tells the compiler that the function returns an object that is not aliased, that is, referenced by any other pointers. Esto permite al compilador realizar optimizaciones adicionales.This allows the compiler to perform additional optimizations.

SintaxisSyntax

*__declspec(restrict)***pointer_return_type función();__declspec(restrict) pointer_return_type function();

ObservacionesRemarks

El compilador propaga __declspec(restrict) .The compiler propagates __declspec(restrict). Por ejemplo, la función de CRT malloc tiene una __declspec(restrict) decoración y, por consiguiente, el compilador supone que los punteros inicializados en las ubicaciones de memoria de malloc tampoco están alias por punteros previamente existentes.For example, the CRT malloc function has a __declspec(restrict) decoration, and therefore, the compiler assumes that pointers initialized to memory locations by malloc are also not aliased by previously existing pointers.

El compilador no comprueba que el puntero devuelto no tiene un alias en realidad.The compiler does not check that the returned pointer is not actually aliased. Es responsabilidad del desarrollador asegurarse de que el programa no alias de un puntero marcado con el modificador restrict __declspec .It is the developer's responsibility to ensure the program does not alias a pointer marked with the restrict __declspec modifier.

Para obtener una semántica similar en las variables, vea __restrict.For similar semantics on variables, see __restrict.

Para otra anotación que se aplique a los alias en una función, vea __declspec (noalias).For another annotation that applies to aliasing within a function, see __declspec(noalias).

Para obtener información sobre la restrict palabra clave que forma parte de C++ amp, vea restrict (C++ amp).For information about the restrict keyword that is part of C++ AMP, see restrict (C++ AMP).

EjemploExample

En el siguiente ejemplo se muestra el uso de __declspec(restrict) .The following sample demonstrates the use of __declspec(restrict).

Cuando __declspec(restrict) se aplica a una función que devuelve un puntero, indica al compilador que la memoria a la que apunta el valor devuelto no tiene alias.When __declspec(restrict) is applied to a function that returns a pointer, this tells the compiler that the memory pointed to by the return value is not aliased. 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.In this example, the pointers mempool and memptr are global, so the compiler can't be sure that the memory they refer to is not aliased. Sin embargo, se utilizan en ma y su llamador init de forma que devuelve memoria a la que no hace referencia el programa, por lo que __decslpec (Restrict) se usa para ayudar al optimizador.However, they are used within ma and its caller init in a way that returns memory that isn't otherwise referenced by the program, so __decslpec(restrict) is used to help the optimizer. 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 se puede incluir en el alias de los punteros existentes.This is similar to how the CRT headers decorate allocation functions such as malloc by using __declspec(restrict) to indicate that they always return memory that cannot be aliased by existing pointers.

// 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 MicrosoftEND Microsoft Specific

Vea tambiénSee also

Palabras claveKeywords
__declspec__declspec
__declspec (noalias)__declspec(noalias)