restrict
Microsoft 固有の仕様
ポインター型を返す関数宣言または定義に適用された場合、restrict
は、その関数が、aliased が設定されていないオブジェクト、つまり他のポインターによって参照されているオブジェクトを返すことをコンパイラに指示します。 これにより、コンパイラは追加の最適化を実行できます。
構文
__declspec(restrict)
pointer_return_typefunction();
解説
コンパイラが __declspec(restrict)
を伝達します。 たとえば、CRT malloc
関数には __declspec(restrict)
装飾があるため、コンパイラは、malloc
によってメモリ位置に初期化されたポインターが、以前の既存のポインターによってエイリアス化されていないと見なします。
コンパイラは、返されたポインターが実際にエイリアス化されていないことを確認しません。 restrict __declspec 修飾子で示したポインターにエイリアスがないかどうか確認するのは開発者の責任です。
変数の同様のセマンティクスについては、「__restrict」を参照してください。
関数内の別名に適用される別の注釈については、「__declspec」 (noalias) を参照してください。
C++ AMP の一部である restrict
キーワードの詳細については、「restrict (C++ AMP)」を参照してください。
例
次のコードは、__declspec(restrict)
の使用例です。
__declspec(restrict)
がポインターを返す関数にが適用されると、戻り値が指すメモリがエイリアス化されていないことをコンパイラに通知します。 この例では、ポインター mempool
と memptr
はグローバルであるため、コンパイラは参照するメモリがエイリアス化されていないことを確認できません。 ただし、これらはプログラムによって参照されていないメモリを返すように、ma
と、その呼び出し元 init
内で使用されるため、オプティマイザーを支援するために __decslpec(restrict) が使用されます。 これは、CRT ヘッダーが、__declspec(restrict)
を使用して、既存のポインターによってエイリアス化できないメモリを常に返すことを示す malloc
などの割り当て関数を装飾する方法に似ています。
// 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);
}
Microsoft 固有の仕様はここまで
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示