33

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++ 開発者は、上記が実際のアプリケーションで使用される可能性がある、または非常にまれな例を挙げてもらえますか?

4

1 に答える 1

37
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オブジェクトが静的な保存期間を持ち、他の翻訳単位からアクセスできないようにする必要があることを除いて、同じです。
于 2013-04-28T05:47:15.640 に答える