register、constおよびstaticキーワードと組み合わせたvolatileキーワードのさまざまな使用法について疑問に思っています。どのような影響があるのかはわかりません。
register volatile int T=10;
Tをレジスターに格納するようコンパイラーに提案し、Tの値は外部(OS、ハードウェア、別のスレッド)から変更できるようにする
const volatile int T=10;
プログラム自体はTを変更できませんが、Tはコード外のどこかで変更できます。
static volatile int T=10;
Tがクラスのデータメンバーである場合、それはクラスのすべてのオブジェクトがTに対して同じ値を持ち、Tは外部のどこからでも変更できることを意味します。 Tがファイルのグローバル変数である場合、他のファイル(プロジェクトの一部)のソースコードはTにアクセスできませんが、Tは外部のどこからでもアクセスできます。 Tが関数のローカル変数である場合、初期化されると、プログラムの終了までメモリに残り、外部のどこからでも変更できます。
私の考えは正しいですか、経験豊富なC++開発者であれば、上記が実際のアプリケーションで使用される可能性のある例を示すことができますか、それとも非常にまれですか?
register volatile int T=10;
volatile
修飾子は、コンパイラがT
への最適化を適用したり、アクセスを並べ替えたりできないことを意味しますが、register
は、T
が頻繁に使用されることを示すコンパイラへのヒントです。 T
のアドレスが取得された場合、ヒントはコンパイラによって単に無視されます。 register
は非推奨ですが、まだ使用されています。
実用的な使い方:
私はそれを使用したことがなく、その必要性を感じたこともないし、今のところ本当に考えることもできません。
const volatile int T=10;
const
修飾子は、T
をコードで変更できないことを意味します。そうしようとすると、コンパイラが診断を提供します。 volatile
は、ケース1と同じ意味です。コンパイラは、T
へのアクセスを最適化したり、並べ替えたりできません。
実用的な使い方:
static volatile int T=10;
static
ストレージ修飾子はT
静的ストレージ期間(C++ 11§3.7)と 内部リンケージ を提供しますが、volatile
は引き続き最適化と並べ替えを制御します。
実用的な使い方:
volatile
と同じですが、オブジェクトに静的ストレージ期間があり、他の翻訳単位からアクセスできないことが必要です。