C99 では、ポインタである関数パラメータ用の型修飾子としてキーワード restrict が導入されました。この修飾子は、引数によって指定されるオブジェクトへのすべてのアクセスは、このポインタ経由で実行されることを意味します。コンパイラは、そのポインタを間接参照するコードによってのみオブジェクトが変更されるという知識に基づいて最適化を行うことができます。
この C++ 言語拡張は、https://gcc.gnu.org/onlinedocs/gcc-5.1.0/gcc/Restricted-Pointers.html に記載されている gcc 拡張に基づいています。キーワード __restrict および __restrict__ (ただし restrict は含まない) は、ポインタまたは参照型を持つ関数パラメータの型修飾子として認識されます。この修飾子は、クラスオブジェクトが「this」ポインタ以外によってアクセスされないことを示す、非静的クラスメンバー関数で使用することもできます。
任意の数の関数パラメータを制限付きとして宣言できます。
このキーワードはすべてのコンパイラモードで認識されます。これらのキーワードをここで説明されている以外の方法で使用すると、エラーになります。
次に例を示します。
int f1(int* __restrict p1, int* __restrict p2); struct S { int f2() __restrict; };
最初の例では、関数によってほかのあらゆる方法で参照されない個別のオブジェクトを p1 および p2 で指示することをプログラマが指定します。2 番目の例では、「this」ポインタが制限付きとして宣言され、プログラマは、関数に関連付けられたオブジェクトが「this」以外でアクセスされないことを指定します。
__restrict 修飾子によって暗黙的に指定された指定にプログラムが実際に従わない場合、プログラム結果は予期できないものになります。
–xrestrict コマンド行オプションは、引き続き受け付けられます。__restrict キーワードをソースコードで使用する方が柔軟性が高く、コマンド行オプションよりも推奨されることがあります。
–xrestrict[=f]も参照してください。