キーワードvolatileとrestrict
volatile
一、volatileとは何ですか.コンパイラ最適化とは
volatileはタイプ修飾子であり、コンパイラの最適化を防止する主な役割を果たしています.では、コンパイラの最適化とは何でしょうか.2つの例を見てみましょう.
例1:
x = 0x04; x = 0x06; x = 0x08; ハードウェアでは3つの命令で順次実行されますが、コンパイラにコンパイルさせると、前の2つの文を無視してx=0 x 08を直接取得します.int i = 5, j, k; j = i; k = i; コンパイラがコンパイルする場合、iは2番目と3番目の文の間に左値として存在しないため、3番目の文k=iとなる.本当にiが存在するメモリ領域にiの値を取得するのではなく、2番目の文がレジスタに保存されているコピーを直接取得します.
例2:
コンパイラ最適化とは、ある変数アドレスを仮定することであり、volatileの役割は、コンパイラが変数の値を仮定せずに、毎回メモリに注意深く変数値にアクセスすることである.
二、なぜvolatileを使うのか.
前の例では、コンパイラ最適化とは何かを示していますが、コンパイラ最適化でエラーが発生しますか?できない場合は、コンパイラの最適化を防ぐ必要はありません.
コンパイラ最適化はエラーが発生する可能性があります.前述したように、コンパイラが最適化されると、変数の値を取ることはレジスタのコピーを取る可能性がありますが、実際の実行時には、いくつかの変数の値がいつでも未知の要因によって変更される可能性があります.いくつかの変数の値が変更され、volatileが必要な場合は、次のようになります.
(1)パラレルデバイスのハードウェアレジスタ
(2)割り込みサブルーチンが使用する非自動変数
(3)マルチスレッドアプリケーションにおいていくつかのスレッドで用いられる共有変数
restrict
まず、restrictはc 99のキーワードであり、c 89とc++はサポートされていません.
restrictはポインタを修飾するために使用され、コンパイラが指すオブジェクトはポインタのみでアクセスでき、コンパイラが最適化できることをコンパイラに伝えるために使用されます.
例: int var = 5;
int *restrict varp = &var;
*varp = 10; //
*varp = 20;
コンパイラは、次のように直接最適化されます. int var = 5;
int *restrict varp = &var;
*varp = 20;//<span style="font-family: Arial, Helvetica, sans-serif;">*varp = 10; 。</span>
gccは、上記の機能を実現するためにコンパイラの最適化レベル(−O)を変更する必要があるようです.
まず、restrictはc 99のキーワードであり、c 89とc++はサポートされていません.
restrictはポインタを修飾するために使用され、コンパイラが指すオブジェクトはポインタのみでアクセスでき、コンパイラが最適化できることをコンパイラに伝えるために使用されます.
例:
int var = 5;
int *restrict varp = &var;
*varp = 10; //
*varp = 20;
コンパイラは、次のように直接最適化されます.
int var = 5;
int *restrict varp = &var;
*varp = 20;//<span style="font-family: Arial, Helvetica, sans-serif;">*varp = 10; 。</span>
gccは、上記の機能を実現するためにコンパイラの最適化レベル(−O)を変更する必要があるようです.