register volatile修飾子


register修飾子は、コンパイラに対応する変数が頻繁に使用されることを示し、可能であればCPUのレジスタに保存して記憶速度を速めるべきである.
* Procedure for the assignment of structures, */   
/* if the C compiler doesn't support this feature */   
#ifdef NOSTRUCTASSIGN   
memcpy (d, s, l)  
{
     register char *d;
   register char *s;
   register int i;
   while (i--)   
     *d++ = *s++;   
}
   #endif 

volatileは、コンパイラiがいつでも変化する可能性があることを示し、それを使用するたびにiのアドレスから読み出さなければならないため、コンパイラが生成した実行可能コードは、iのアドレスからデータを読み直してkに置く.最適化の方法は、コンパイラがiからデータを読み出すコード間のコードがiを操作していないことを2回発見したため、前回読んだデータをkに自動的に配置することである.iから読み直すのではなく.これにより、iがレジスタ変数であるか、ポートデータを表すとエラーが発生しやすいため、volatileは特殊なアドレスへの安定したアクセスを保証し、エラーが発生しない.
volatileとして定義された変数は、コンパイラがこの変数の値を仮定しないように、この変数が予想外に変更される可能性があるということです.正確には、オプティマイザは、レジスタに保存されたバックアップではなく、この変数を使用するたびに、この変数の値を慎重に再読み取りする必要があります.
以下にvolatile変数のいくつかの例を示す:1)パラレルデバイスのハードウェアレジスタ(例えば、ステータスレジスタ)2)サービスサブルーチンでアクセスされる非自動変数(Non-automatic variables)3)マルチスレッドアプリケーションでいくつかのタスク共有変数によってこの問題に答えられない人は雇用されない.これはCプログラマーと組み込みシステムプログラマーを区別する最も基本的な問題だと思います.組み込み型の奴らはハードウェア、割り込み、RTOSなどとよく付き合い、volatile変数を使う必要がある.volatileの内容が分からないと災難をもたらす.面接された人がこれが質問だと正確に答えたとしたら(うん、そうなのか疑問)、ちょっと深く考えて、こいつがvolatileの完全な重要性を知っているかどうか見てみましょう.1)パラメータはconstでもvolatileでもいいですか.なぜか説明する.2); ポインタはvolatileですか?なぜか説明する.3); 次の関数にエラーがあります.int square(volatile int*ptr){return*ptr**ptr;}1)はい、そうです.1つの例は、読み取り専用のステータスレジスタである.それはvolatileです.予想外に変わる可能性があるからです.これはconstです.プログラムはそれを修正しようとしないからです.2); はい.これはあまりよくありませんが.1つの例は、サービスサブルーチンがbufferを指すポインタを修正する場合である.3)このコードは少し変態です.このコードの目的は、ポインタ*ptrが値の二乗を指すことですが、*ptrがvolatile型パラメータを指すため、コンパイラはint square(volatile int*ptr){int a,b;a=*ptr;b=*ptr;return a*b;}のようなコードを生成します.*ptrの値は予想外に変化する可能性があるため、aとbは異なる可能性がある.その結果、このコードはあなたが望んでいる平方値ではない可能性があります.正しいコードは以下の通りです:long square(volatile int*ptr){int a;a=*ptr;return a*a;ビット操作(Bit manipulation)