register、volatile、restrictの3つのキーワードの使い方


register
修飾子registerを使用して宣言された変数はレジスタストレージタイプに属します.このタイプは、自動ストレージタイプと同様に、自動ストレージ期間、コードブロックの役割ドメイン、および内部接続を有する.registerとして宣言するのは要求にすぎないため、変数は通常の自動変数である可能性があります.いずれの場合もregisterで修飾された変数はアドレスを取得できません.初期化されていない場合、その値は未定です.
 
volatile volatileは、コンパイラに、プログラムによって変更できるほか、他のエージェント、スレッドによって変更される可能性があることを通知します.したがって、volatileで宣言された変数の値を使用すると、レジスタ内のキャッシュの値を使用せずに、システムは常にそのメモリからデータを再読み込みします.たとえば、
val1=x;
val2=x;
volatileが宣言されていない場合、システムはval 2に値を割り当てるときに、メモリの初期位置からではなくレジスタからxを直接読み出す可能性があります.2回の割り当ての間、xはオペレーティングシステム、ハードウェア、または他のスレッドなど、いくつかのコンパイラの未知の要因によって完全に変更される可能性があります.volatileと宣言すると、コンパイラはキャッシュを使用せず、毎回メモリからxを再読み込みします.
restrict
restrictはc 99に導入され、ポインタを限定するためにのみ使用でき、ポインタがデータオブジェクトにアクセスする唯一の初期の方法であることを示し、以下の例を考慮する.
view source print ? 1 int ar[10]; 2 int * restrict restar=( int *) malloc (10* sizeof ( int )); 3 int *par=ar;
ここでrestarはmalloc()によって割り当てられたメモリにアクセスする唯一で初期の方法であることを説明する.parは違います.では、
view source print ? 1 for (n=0;n<10;n++) 2 { 3     par[n]+=5; 4     restar[n]+=5; 5     ar[n]*=2; 6     par[n]+=3; 7     restar[n]+=3; 8 }
restarは割り当てられたメモリにアクセスする唯一で初期の方法であるため、コンパイラは上述したrestarの動作を最適化することができる:restar[n]+=8;parは配列arにアクセスする唯一の方法ではないので、par[n]+=8;の最適化はできません.par[n]+=3の前にar[n]*=2が変化したためである.キーワードrestricを使用すると、コンパイラは安心して最適化できます.このキーワードは古いFORTRANに由来しているそうです.
 
まとめ
2つのキーワード:volatileとrestrict、両方はコンパイラの最適化を容易にするためです.