web-dev-qa-db-ja.com

C ++でconst volatile、register volatile、static volatileをいつ使用しますか?

registerconstおよび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++開発者であれば、上記が実際のアプリケーションで使用される可能性のある例を示すことができますか、それとも非常にまれですか?

28
Avraam Mavridis
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と同じですが、オブジェクトに静的ストレージ期間があり、他の翻訳単位からアクセスできないことが必要です。
32
Alok Save