Sdílet prostřednictvím


restrict

Specifické pro Microsoft

Při použití na deklaraci funkce nebo definici, která vrací typ ukazatele, informuje kompilátor, restrict že funkce vrátí objekt, který není aliasovaný, tj. odkazovanými jinými ukazateli. Kompilátor tak může provádět další optimalizace.

Syntaxe

__declspec(restrict) pointer_return_typefunction();

Poznámky

Kompilátor se šíří __declspec(restrict). Funkce CRT malloc __declspec(restrict) má například dekoraci, a proto kompilátor předpokládá, že ukazatele inicializované na umístění malloc paměti také nejsou aliasovány dříve existujícími ukazateli.

Kompilátor nekontroluje, že vrácený ukazatel není ve skutečnosti aliasován. Je zodpovědností vývojáře, aby program neposílil ukazatel označený modifikátorem omezení __declspec .

Podobné sémantiky u proměnných najdete v tématu __restrict.

Další poznámku, která se vztahuje na aliasy v rámci funkce, najdete v tématu __declspec(noalias).a0>

Informace o klíčovém slově restrict , které je součástí C++ AMP, naleznete v tématu omezení (C++ AMP).

Příklad

Následující ukázka ukazuje použití __declspec(restrict).

Při __declspec(restrict) použití funkce, která vrací ukazatel, to kompilátoru říká, že paměť odkazovaná návratovou hodnotou není aliasována. V tomto příkladu jsou ukazatele mempool a memptr globální, takže kompilátor si nemůže být jistý, že paměť, na kterou odkazují, není aliasována. Používají se však v rámci ma volajícího a jeho volajícím init způsobem, který vrací paměť, na kterou program jinak neodkazuje, takže __decslpec(omezení) slouží k usnadnění optimalizátoru. To se podobá tomu, jak hlavičky CRT ozdobují funkce přidělování, jako malloc je použití __declspec(restrict) , aby vždy vracely paměť, která nemůže být aliasována existujícími ukazateli.

// 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);
}

END Microsoft Specific

Viz také

Klíčová slova
__declspec
__declspec(noalias)