careercup-CとC++13.5
3239 ワード
13.5 C言語キーワード「volatile」の意味(または重要性)について話しますか?
に答える
キーワードvolatileの役割は、コードが変数を変更しなくても、その変数の値が外部で変更される可能性があることを示すコンパイラです.オペレーティングシステム、ハードウェア、または他のスレッドで変数を変更できます.この変数の値は予想外に変更される可能性があるため、コンパイラは使用するたびにメモリからこの値を再取得します.
volatileは「変わりやすい」という意味で、アクセスレジスタはアクセスメモリよりずっと速いので、コンパイラは一般的にアクセスメモリを減らす最適化をします.volatileというキーワードはコンパイラに注意します.宣言された変数はいつでも変化する可能性があります(外部で変更されます).そのため、変数に関連するコードはコンパイル最適化されず、エラーを回避します.
volatile変数を宣言します.
volatile型のメモリを指すポインタを宣言します(ポインタが指すメモリの変数はいつでも変化します):
非volatileデータを指すvolatileポインタは珍しいが、実行可能であり、volatileポインタを宣言し、非volatileメモリを指す::
volatileポインタを宣言します.volatileメモリ(ポインタとポインタの両方がランダムに変化する可能性があります):(volatileはconstと似ています)
volatileの宣言での使用はconstと同じです.volatileは*番の左側にあり、ポインタの指すものを修飾しています.*番の右側に修飾されているのはポインタです.
volatileで修飾された変数に関連するコードはコンパイラによって最適化されませんが、どのようなメリットがありますか?次の例を見てみましょう.
上記のコードは無限ループのリズムのように見えますが、コンパイラは次のように最適化する可能性があります.
プログラムではoptを変更していないためifの条件を一定に設定します.これで無限ループに陥る.しかし,optにvolatile修飾を加えると,外部プログラムがそれを修正する可能性があることを示した.すると、コンパイラは上記の最適化を行わず、上記プログラムはoptが外部プログラムによって修正された後にループから飛び出します.さらに、マルチスレッドプログラムでグローバル変数を宣言し、どのスレッドでもこれらの変数を変更できる場合、キーワードvolatileも役立ちます.この場合、コンパイラにこれらのグローバル変数の関連コードを最適化しないように明確に伝えます.
に答える
キーワードvolatileの役割は、コードが変数を変更しなくても、その変数の値が外部で変更される可能性があることを示すコンパイラです.オペレーティングシステム、ハードウェア、または他のスレッドで変数を変更できます.この変数の値は予想外に変更される可能性があるため、コンパイラは使用するたびにメモリからこの値を再取得します.
volatileは「変わりやすい」という意味で、アクセスレジスタはアクセスメモリよりずっと速いので、コンパイラは一般的にアクセスメモリを減らす最適化をします.volatileというキーワードはコンパイラに注意します.宣言された変数はいつでも変化する可能性があります(外部で変更されます).そのため、変数に関連するコードはコンパイル最適化されず、エラーを回避します.
volatile変数を宣言します.
volatile int x;
int volatile x;
volatile型のメモリを指すポインタを宣言します(ポインタが指すメモリの変数はいつでも変化します):
volatile int *x;
int volatile *x
非volatileデータを指すvolatileポインタは珍しいが、実行可能であり、volatileポインタを宣言し、非volatileメモリを指す::
int* volatile x;
volatileポインタを宣言します.volatileメモリ(ポインタとポインタの両方がランダムに変化する可能性があります):(volatileはconstと似ています)
volatile int * volatile x;
int volatile * volatile x;
volatileの宣言での使用はconstと同じです.volatileは*番の左側にあり、ポインタの指すものを修飾しています.*番の右側に修飾されているのはポインタです.
volatileで修飾された変数に関連するコードはコンパイラによって最適化されませんが、どのようなメリットがありますか?次の例を見てみましょう.
int opt = 1;
void Fn(void){
start:
if (opt == 1) goto start;
else break;
}
上記のコードは無限ループのリズムのように見えますが、コンパイラは次のように最適化する可能性があります.
void Fn(void){
start:
int opt = 1;
if (true)
goto start;
}
プログラムではoptを変更していないためifの条件を一定に設定します.これで無限ループに陥る.しかし,optにvolatile修飾を加えると,外部プログラムがそれを修正する可能性があることを示した.すると、コンパイラは上記の最適化を行わず、上記プログラムはoptが外部プログラムによって修正された後にループから飛び出します.さらに、マルチスレッドプログラムでグローバル変数を宣言し、どのスレッドでもこれらの変数を変更できる場合、キーワードvolatileも役立ちます.この場合、コンパイラにこれらのグローバル変数の関連コードを最適化しないように明確に伝えます.