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);
}
Завершение блока, относящегося только к системам Майкрософт
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по