__restrict
restrict __declspec 修飾子と同様に、__restrict キーワードは、現在のスコープではシンボルがエイリアス化されないことを示します。 __restrict キーワードは、restrict __declspec 修飾子とは次の点で相違があります。
__restrict キーワードは変数に対してのみ有効です。__declspec(restrict) は関数の宣言と定義内でのみ有効です。
__restrict が使用されていると、コンパイラは変数の非エイリアスのプロパティを伝達しません。 つまり、__restrict 変数を __restrict ではない変数に代入する場合、コンパイラは __restrict でない変数がエイリアス化されないことを前提としません。 これは C99 仕様の restrict キーワードの動作とは異なります。
一般に、関数全体の動作に影響を及ぼす場合、キーワードよりも __declspec を使用する方が適切です。
__restrict は C99 仕様の restrict に似ていますが、__restrict は C++ または C プログラムで使用できます。
C++ の参照に対する __restrict はサポートされていません。
注意
volatile (C++) キーワードも持っている変数に対して使用すると、volatile が優先されます。
使用例
// __restrict_keyword.c
// compile with: /LD
// In the following function, declare a and b as disjoint arrays
// but do not have same assurance for c and d.
void sum2(int n, int * __restrict a, int * __restrict b,
int * c, int * d) {
int i;
for (i = 0; i < n; i++) {
a[i] = b[i] + c[i];
c[i] = b[i] + d[i];
}
}
// By marking union members as __restrict, tell compiler that
// only z.x or z.y will be accessed in any given scope.
union z {
int * __restrict x;
double * __restrict y;
};