15

揮発性変数はプログラム メモリのどこに格納されますか (どのセクションに) ?

4

6 に答える 6

21

volatileストレージ クラス指定子ではなく型修飾子であるため、ストレージの場所をまったく決定しません。ストレージではなく、変数の型の定義に影響します。

たとえば、レジ​​スターで以前に読み取られた値が有効であると想定するのではなく、コンパイラーに、変数の記憶域の場所 (それがどこにあっても) からのである変数を明示的に読み取るように強制するだけです。volatile

于 2009-11-03T10:21:16.650 に答える
12

Cvolatileでは、コンパイラに「この変数の値が変更されていないと仮定するのに十分な知識がありません」と伝えるだけです。BSS、CSSなどの「セクション」はありません。

特定の種類の最適化を防ぐためのコンパイラへのフラグと考えてください。ハードウェアデバイスの入力により、特定のアドレスのメモリが「変更」される可能性がある組み込みプログラミングで非常に便利です。

ここに良い説明があります:http://www.embedded.com/columns/programmingpointers/174300478?_requestid=137658

于 2009-11-03T06:03:42.667 に答える
7

変数の揮発性は、変数が格納される場所を変更しません。変更されるのは、読み取りと書き込みに関してアクセスする方法に関するセマンティクスです。

C 標準が volatile の実装について何も述べていないと思います。しかし、通常、volatile は、変数に対する書き込み操作の解放セマンティクスと、変数の読み取り操作に対する取得セマンティクスを保証します。ただし、これはすべての実装に当てはまるわけではなく、特定のコンパイラが保証するものを読む必要があります

于 2009-11-03T05:43:42.393 に答える
4

volatile は、ストレージ クラスを扱うものではありません。

volatile は、コンパイラにその変数の「最適化を行わないように」指示するか、コンパイラに強制するだけです。そのため、コンパイラはその変数のコードを最適化し、指定された場所から値を読み取らず、前の値を保持する内部レジスタを介しません。

したがって、変数を揮発性として宣言することにより、外部イベントによって変更される可能性のある最新の値を取得することが保証されます。

その変数を揮発性として宣言していない場合、コードは正常に動作する可能性がありますが、正しい値を取得できない可能性がある場合があります..そのため、変数を揮発性として宣言する必要があります。

volatile は通常、ハードウェア関連のピンの割り込みなどの外部イベントを処理するときに使用されます。

例。ADC 値の読み取り。

const voltile は、コードでその変数の値を変更または変更できないことを意味します。外部イベントのみが値を変更できます。

コントローラ ピンは一般に揮発性として定義されます。揮発性コントローラーが「ラッチによる読み取り」ではなく「ピンによる読み取り」を行うため、変数を宣言することによる可能性があります...これは私の仮定です。間違っているかもしれません...

しかし、変数を揮発性として選択するときはまだ多くの混乱があります..

変数の値が予期せず変更される可能性がある場合は常に、変数を volatile として宣言する必要があります。実際には、次の 3 種類の変数のみが変更される可能性があります。

  1. メモリ マップド ペリフェラル レジスタ

  2. 割り込みサービス ルーチンによって変更されたグローバル変数

  3. マルチスレッドアプリケーション内のグローバル変数

リンク : http://eetimes.com/discussion/beginner-s-corner/4023801/Introduction-to-the-Volatile-Keyword

そのため、そのような場合は変数に揮発性として提供されます。

于 2012-06-07T13:25:33.777 に答える
2

「揮発性」は、C/C++ 仕様でメモリ マップド デバイスの使用を許可するために使用されました。このキーワードで定義された変数を最適化しないようにコンパイラに指示します。これは、変数がコンパイラに表示されるコードでその状態を変更していないように見えるからです。

于 2013-04-25T01:30:56.077 に答える
2

volatile 変数をメモリの「特別な」セクションに格納する理由はありません。通常、不揮発性変数を含む他の変数と一緒に保存されます。一部のコンパイラが揮発性変数をメモリの特別なセクションに格納することを決定した場合、それを妨げるものは何もありません。しかし、言語レベルでは、これにはまったく理由がありません。

なんでそんな質問するの?メモリの特別なセクションに保存する必要があると考えた理由は何ですか?

于 2009-11-03T05:44:04.577 に答える