ように、 _ _declspec (制限) 修飾子、 _ _restrictキーワードは、シンボルがエイリアス化された現在のスコープ内ではないことを示します。Like the __declspec ( restrict ) modifier, the __restrict keyword indicates that a symbol is not aliased in the current scope. _ _Restrictキーワードとは異なります、__declspec ( restrict )修飾子は、次の方法で。The __restrict keyword differs from the __declspec ( restrict ) modifier in the following ways:

  • _ _Restrictキーワードは、変数にのみ有効ですし、__declspec ( restrict )関数宣言と定義でのみ有効です。The __restrict keyword is valid only on variables, and __declspec ( restrict ) is only valid on function declarations and definitions.

  • _ _restrictのような制限C99 仕様からが _ _restrictで使用できるC++または C プログラム。__restrict is similar to restrict from the C99 spec, but __restrict can be used in C++ or C programs.

  • ときに _ _restrictが使用すると、コンパイラは伝達されません変数の非エイリアスのプロパティ。When __restrict is used, the compiler will not propagate the no-alias property of a variable. つまりを割り当てた場合、 _ _restrict変数以外に _ _restrict変数コンパイラも、-_ _restrict 以外には別名を変数。That is, if you assign a __restrict variable to a non-__restrict variable, the compiler will still allow the non-__restrict variable to be aliased. これは、別の動作、制限C99 仕様のキーワード。This is different from the behavior of the restrict keyword from the C99 specification.

一般に、関数全体の動作に影響を及ぼす場合、キーワードよりも __declspec ( restrict ) を使用する方が適切です。Generally, if you affect the behavior of an entire function, it is better to use __declspec ( restrict ) than the keyword.

以前のバージョンとの互換性のため _restrictのシノニムです _ _restrictしない限り、コンパイラ オプション/Za(言語拡張機能を無効にする)は指定します。For compatibility with previous versions, _restrict is a synonym for __restrict unless compiler option /Za (Disable language extensions) is specified.

Visual Studio 2015 以降では、 _ _restrictで使用できるC++参照。In Visual Studio 2015 and later, __restrict can be used on C++ references.


持っている変数に対して使用すると、揮発性キーワード、揮発性が優先されます。When used on a variable that also has the volatile keyword, volatile will take precedence.


// __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;

関連項目See also