restrict 型修飾子は、ポインターにしか適用できません。この型修飾子を使用す
るポインター宣言は、ポインターおよびポインターがアクセスするオブジェクトの間で特別な関係
を確立し、ポインターおよび そのポインターを基にした式が、オブジェクトの値に直接的または間
接的にアクセスする唯一の方法になります。
ポインターは、メモリー内のロケーションのアドレスです。複数のポインターがメモリーの同じチャンクにアクセスでき、プログラムの実行中にそれを変更することができます。 restrict 型修飾子は、restrict で修飾されたポインターがアドレスしたメ モリーが 変更された場合に、他のポインターがその同じメモリーにアクセスしないようにする、コンパイラーへの指示です。 コンパイラーは、不適切な振る舞いが生じないような方法によって、restrict で修飾 されたポインタ ーを含めてコードを最適化することを選択する場合があります。restrict で修飾され たポインターが意図されたとおりに使用されていることを確かめることは、プログラマーの責任です。 そうしない場合、定義されていない振る舞いが生じる場合があります。
メモリーの特定のチャンクが変更されていなければ、複数の制限付きポ インター を使ってそれに別名を付けることができます。
以下の例では、制限付きポインターを foo() のパラメーターとして示し、2 つの制 限付きポインターによって未変更オブジェクトに別名を付ける方法が示されています。
void foo(int n, int * restrict a, int * restrict b, int * restrict c) { int i; for (i = 0; i < n; i++) a[i] = b[i] + c[i]; }
制限付きポインター間の割り当ては制限されており、関数呼び出しと、ネストされた同等のブロ ックとの間の区別がつきません。
{ int * restrict x; int * restrict y; x = y; // undefined { int * restrict x1 = x; // okay int * restrict y1 = y; // okay x = y1; // undefined } }
制限付きポインターが含まれるネストされたブロックでは、外部ブロックから内部ブロ ックへの制限付きポインターの割り当てのみが許可されます。 例外は、制限付きポインターが宣言されたブロックが実行を終了したときです。 プログラムのこの時点では、制限付きポインターの値をそれが宣言されたブロックの外部に持ち出すことができます。
C++ は、C99 と互換性を持たせるための非直交の言語拡張として
、restrict キーワードをサポートします。
コンパイラーは、キーワードを消費および無視しますが、
誤った使用法に対しては、診断メッセージを発行します。これが非直交である理由は、既存の C++ プログラムが restrict を変数名として使用できるためです。
関連参照