restrict

Seção específica da Microsoft

Quando aplicado a uma declaração ou a uma definição de função que retorna um tipo de ponteiro, restrict diz ao compilador que a função retorna um objeto sem alias, ou seja, referenciado por quaisquer outros ponteiros. Isso permite que o compilador execute otimizações adicionais.

Sintaxe

__declspec(restrict)pointer_return_typefunction();

Comentários

O compilador propaga __declspec(restrict). Por exemplo, a função CRT malloc tem uma decoração __declspec(restrict) e, portanto, o compilador pressupõe que os ponteiros inicializados para locais de memória por malloc também não tem alias por ponteiros existentes anteriormente.

O compilador não verifica se o ponteiro retornado realmente não possui alias. É responsabilidade do desenvolvedor assegurar que o programa não coloque alias em um ponteiro com o modificador restrict __declspec.

Para a semântica semelhante em variáveis, confira __restrict.

Para outra anotação que se aplica ao alias dentro de uma função, confira __declspec(noalias).

Para obter informações sobre a palavra-chave restrict que é parte do C++ AMP, confira restrict (C++ AMP).

Exemplo

O exemplo a seguir demonstra o uso de __declspec(restrict).

Quando __declspec(restrict) é aplicado a uma função que retorna um ponteiro, isso informa ao compilador que a memória apontada pelo valor retornado não tem alias. Neste exemplo, os ponteiros mempool e memptr são globais, portanto, o compilador não pode ter certeza de que a memória à qual se referem não está com alias. No entanto, eles são usados dentro ma e seu chamador init de maneira que retorna memória que não é referenciada de outra forma pelo programa, portanto __decslpec(restrict) é usado para ajudar o otimizador. Isso é semelhante a como os cabeçalhos CRT decoram funções de alocação, como malloc usando __declspec(restrict) para indicar que eles sempre retornam memória que não pode ser alias por ponteiros 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);
}

Fim da seção específica da Microsoft

Confira também

Palavras-chave
__declspec
__declspec(noalias)