キーワードRestrict

1064 ワード

restrictはc 99に導入され、キーワードrestrictはポインタを限定するためにのみ使用される.このキーワードは、コンパイラに通知するために使用され、ポインタが指す内容を変更するすべての操作は、ポインタに基づいている.すなわち、他の変更操作を行う方法は存在しない.つまり、コンパイラにこのポインタが指す内容を教えるだけで、このポインタだけが修正できます.しかし、実際にはこの内容を修正する方法があるかもしれません.コンパイラがポインタに関連するコンテンツを最適化できることを保証するために、コンパイラに保証を提供しただけです.
voidvector_add(const double *x, const double *y, double *result)

{
int i;
for(i = 0; i < 64; ++i)

result[i]= x[i] + y[i];

}


この関数がマルチプロセッサのコンピュータ上で実行される場合、コンパイラは、このループを2つのループに分割し、1つのプロセッサがi値を0から31のループを計算し、もう1つのプロセッサがi値を32から63のループを計算することで、2つのプロセッサが同時に動作し、計算時間を半分に短縮することができるように最適化することができます.しかし、このようなコンパイル最適化は正しい結果を保証することができますか?resultとxが指すメモリ区間が重複している場合、result[0]は実はx[1]、result[i]は実はx[i+1]であり、この2つのプロセッサはそれぞれのことをすることができない.2番目のプロセッサの仕事は1番目のプロセッサの最終計算結果に依存しているため、この場合のコンパイル最適化の結果は間違っている.このように、コンパイラは勝手に最適化する勇気がなく、マルチプロセッサが提供する並列性が利用できないのは残念ではないでしょうか.このため、C 99はrestrictキーワードを導入し、プログラマが上記の関数をvoidvector_と宣言した場合add(const double*restrict x,const double*restrict y,double*restrict result)は、コンパイラに安心してこの関数を最適化できるように伝え、プログラマー自身がこれらのポインタが指すメモリ区間が重ならないことを保証します.