C++におけるvolatileおよびコンパイラの最適化

2535 ワード

まず単語「volatile」の意味を見てみましょう.
volatile [ˈvɑlətl]
adj. 変わりやすい、不安定な;揮発しやすい;爆発的楽しい、軽快な;
下は「C++Primer」がvolatileに説明した部分の抜粋です.
「オブジェクトの値がコンパイラの制御またはモニタリング以外で変更される可能性がある場合、オブジェクトはvolatileとして宣言する必要があります.したがって、コンパイラが実行するいくつかの定例的な最適化動作は、volatileとして指定されたオブジェクトに適用できません.volatile修飾子の主な目的は、コンパイラがモニタリングされていない場合に変更される可能性があることを示すプロンプトコンパイラです.したがって、コンパイラは、これらのオブジェクトを参照するコードを独断的に最適化することはできません.」
修飾子volatileは、「変化しやすく、不安定で、いつでも変化する可能性がある」変数を定義しており、volatileと宣言された変数の使用には通常の変数と変わらず、コンパイラが通常の方法で最適化できないことが最大の影響を及ぼしていることがわかります.
これは2つの問題を導入しました.
コンパイラはなぜ変数へのアクセス方法を最適化し、どのように最適化しますか?
コンパイラが最適化された理由:
まず,コンパイラの変数へのアクセス速度,レジスタがメモリより速く,最も遅いのがハードディスクであることを明確にする前提がある.
レジスタがメモリより速い主な原因は、両方の動作方法の違いにあります.
レジスタ自体はCPU内部にあり、非常に簡単に使用できます.第一に、関連するビットを見つけ、第二に、これらのビットを読み出し、Over.
それに比べて、メモリの動作は複雑です.
1.データのポインタを見つける(ポインタはレジスタに格納される可能性があるので、このステップはレジスタのすべての動作を含む).
2.ポインタをメモリ管理ユニット(MMU)に送り、MMUが仮想メモリアドレスを実際の物理アドレスに翻訳する.
3.メモリコントローラに物理アドレスを送り、メモリコントローラによってそのアドレスがどのメモリスロット(bank)にあるかを探し出す.
4.データがどのメモリブロック上にあるかを決定し、そのブロックからデータを読み出す.
5.データはメモリコントローラに返送し、CPUに返送してから使用を開始する.
比較的複雑なワークフローでは、より多くの遅延が発生し、累積するとレジスタよりも遅くなり、実行効率を向上させるために、コンパイラは最適化が必要な変数にアクセスする処理を行います.これがコンパイラによる変数の最適化です.
最適化方法:
多くの場合、変数はレジスタではなくメモリに格納され、変数へのアクセス効率が低い.頻繁に使用される変数に対して、コンパイラは自動的に変数movをレジスタに入れ、使用するときにレジスタの値に直接アクセスしてアクセス速度を速める.これがレジスタの変数に対する最適化である.
キーワードregisterを使用して変数を修飾する場合を除き、初期のCコンパイラでは変数はレジスタに保存されません.
register long int value=123456789;

このキーワードはコンパイラに注意し、定義された変数がプログラムで頻繁に使用されるので、コンパイラはCPUのレジスタに保存してアクセス速度を速めることをお勧めします.その後、コンパイル技術の進歩に伴い、コンパイラはプログラマーよりも変数がメモリに格納されるべきかレジスタに格納されるべきかをよりよく決定することができ、C++98/03規格ではregisterキーワードで宣言された変数は、このキーワードで宣言されない変数と同様に自動記憶期間を有しており、現在は標準C++で、このキーワードを使用することもできるが、しかし、変数の実際の定義には影響しません.
volatileキーワードで修飾された変数については、オペレーティングシステム、ハードウェア、または他のスレッドなど、いくつかのコンパイラで未知の要因で変更される可能性があることをコンパイラに事前に通知しました.このキーワード宣言の変数に遭遇すると、コンパイラは変数にアクセスするコードを最適化せず、特殊なアドレスへの安定したアクセスを提供することができます.つまり、システムはレジスタではなく、常にそのメモリアドレスからデータを読み出し、完了したらすぐに元のパスで変数の変更をメモリに保存します.
volatileの使い方
volatileの使い方はキーワードconstの使い方と同じです
volatile long clock_register;
  volatile                      , const               ,            volatile const   ? 
  
volatile const long clock_register;
const volatile long clock-register;
えは で、1つの は み り の レジスタであり、volatile で の に される があることを している.ここでは、コンパイラの の を し、const でプログラム に され、その を に しようとするべきではない.