restrict

Блок, относящийся только к системам Майкрософт

При применении к объявлению или определению функции, возвращающей тип указателя, restrict компилятор сообщает компилятору, что функция возвращает объект, который не является псевдонимом, т. е. ссылается на любые другие указатели. Это позволяет компилятору выполнять дополнительные оптимизации.

Синтаксис

__declspec(restrict)функция pointer_return_type();

Замечания

Компилятор распространяется __declspec(restrict). Например, функция CRT malloc имеет __declspec(restrict) украшение, поэтому компилятор предполагает, что указатели, инициализированные в расположения malloc памяти, также не являются псевдонимами существующих указателей.

Компилятор не проверка, что возвращенный указатель на самом деле не псевдоним. Разработчик несет ответственность за то, чтобы программа не псевдонима указателя, помеченного модификатором ограничения __declspec .

Аналогичные семантики для переменных см. в __restrict.

Другие заметки, применимые к псевдониму в функции, см. в разделе __declspec(noalias).

Сведения о restrict ключевое слово, которая является частью C++ AMP, см. в разделе "Ограничение " (C++ AMP)".

Пример

В следующем примере показано использование __declspec(restrict).

При __declspec(restrict) применении к функции, возвращающей указатель, компилятор сообщает компилятору, что память, на которую указывает возвращаемое значение, не является псевдонимом. В этом примере указатели mempool и memptr глобальные, поэтому компилятор не может быть уверен, что память, к которую они относятся, не является псевдонимом. Однако они используются в ma пределах и init вызывающем объекте таким образом, чтобы возвращать память, которая не ссылается на программу, поэтому __decslpec(ограничить) используется для помощи оптимизатору. Это аналогично тому, как заголовки CRT украшают функции выделения, такие как malloc использование __declspec(restrict) , чтобы указать, что они всегда возвращают память, которая не может быть псевдонимом существующих указателей.

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

Завершение блока, относящегося только к системам Майкрософт

См. также

Ключевые слова
__declspec
__declspec(ноалиас)