web-dev-qa-db-ja.com

C言語のvolatileキーワード?

C言語のvolatileについて質問があります。

私はいくつかのチュートリアルを読みましたが、それでも理解できません、揮発性物質はこの変数に関連する操作が特定の方法で最適化されるべきではないとコンパイラーオプティマイザーに伝えると言う人もいます。これは、変数の値がレジスターで変更されると、その値がメモリーに影響することを意味します。

また、揮発性とは、このコード以外の手段で値を変更できることを意味する人もいます。

私は2番目のことわからないので、揮発性変数はこのコード以外の手段で変更できますか?どうやって?そして、これら2つは両方とも正しいと言っていますか?

29
user707549

「このコード以外の手段で値を変更できる」という文は、基本的に、別のプログラムまたはハードウェアがその変数を更新できることを意味します。これは完全に可能です。この考え方の1つの方法は、この概念を複数のプログラム間で共有されるファイルに関連付けることです。ファイルは、多くのプログラムで一度に開いたり、書き込んだり、読み取ったりできます。ファイルから読み取る場合は、最も古いものではなく、最新の更新プログラムを確実に読み取る必要があります。

Volatileキーワードに戻って、volatileを変数の前に配置すると、実際には同じことが行われます。変数から読み取るものが、コンパイラーの最適化またはプログラムにあった変数の古いコピーに基づいていないことを確認します。さらに、volatileキーワードは、アクセスのたびに変数がメモリからフェッチされるようにします。したがって、これらのステートメントはどちらもvolatileキーワードに関して正しいです。

41
WindsurferOak

Cは必ずしもコンピューター用ではありません。たとえば、ゲームボーイアドバンス用に開発している場合、ハードウェアによって変更されるメモリロケーションに頻繁に出くわすため、変数を変更しない可能性がありますあなたのコードでは、とにかく変更されます。それがvolatileの意味です。

volatileキーワードを追加することにより、コンパイラに」と伝えます。この変数(メモリの場所)に格納されている値は、myコードなしで変更される可能性があります何でもする。」

19
aviraldg

次のいずれかを検討してください。

  • マルチスレッドアプリケーション、
  • 共有メモリを使用するアプリケーション、
  • i/Oレジスタをアドレス空間にマップするプラットフォームで実行されているアプリケーション、
  • ハードウェアDMA=バックグラウンドで発生しているアプリケーション。

これらの各状況では、現在のスレッドの外部でメモリを変更できます。

変数の値がレジスタ内で変更されると、その値はメモリに影響するはずです」が正しいことに注意してください。あまり明確ではありません。

15

メモリの場所は、プログラムコードの外部でさまざまな方法で変更できます。たとえば、ディスクから読み取ったDMAは、デバイスに何らかのイベントが発生したため、メモリマップされたデバイスが場所を変更する可能性があります。

5

これは、たとえば、マルチスレッドアプリケーションに対応します。変数の値は、複数のスレッドによって変更される可能性があるため、各アクセスでメモリと「同期」する必要があります(値の読み取りまたは書き込みに関係なく)。

3
Flinsch

揮発性変数を宣言するということは、その変数の周囲のコードスニペットを最適化しないようにコンパイラーに指示しているということです。これは、CPUにローカルレジスタまたはキャッシュメモリの変数値を使用せず、毎回メインメモリから値をフェッチすることを強制するためです。

1
user2212525