2012-09-24 14 views
8

私はregisterキーワードが値を計算するためのレジスタを割り当て、volatileキーワードは変数の計算を実行するたびにメモリから値を読み込み、基本的にはコードを最適化しないことを理解します。したがって、変数にこれらのキーワードの両方が割り当てられていれば、基本的にはそれ自体が揮発性であることを意味するでしょうか?私は、サンプルコードを書くことによってその動作を理解することはできません。誰か光を当てることはできますか?Cで "volatile int i"をどのように動作させるのですか?

+3

プラットフォームとコンパイラは何ですか?私は、最も一般的なコンパイラ(GCCなど)は 'register'を尊重するとは思わないのです。 – Joe

+2

'register 'には、宣言された変数のアドレスを取ることができないという効果があります。 –

+0

@ダニエル:私はあなたのポイントを理解していませんでした。ポインタでアクセスできると言っているのですか? – knightofhorizon

答えて

13

ストレージクラスは、プログラムがオブジェクトのアドレスを取得または使用しようとすると、診断を発行するために実装が必要である点を除いて、autoストレージクラスとまったく同じように動作します(6.5.1.3)。 .3.2、6.7.1)。オブジェクトの保存されていない品質を利用するのに十分なスマートなコンパイラは、どのオブジェクトが宣言されるかを追跡するのに十分なほどスマートですから、registerをコンパイラの最適化ヒントとして使用するのは無意味です。register;その代わりに、プログラマーが誤ってオブジェクトのアドレスを取って最適化の機会を破壊していないことをコード品質チェックとして理解する必要があります。

つまり、registerキーワードのすべてのインスタンスを有効なプログラムから削除すると、の効果がありません。はプログラムのセマンティクスにあります。これに関してはstatic_assertと似ています。

volatile修飾子は、オブジェクトへのアクセス(読み取りと書き込み)が副作用とみなされ、最適化できないことを示します。 (すなわち、1つはregisterストレージクラスを有する)定義された位置のメモリに存在しない、これはパフォーマンステストにおいて最も有用であろう目的のために:

start = time(); 
for (multiple loops) 
    register volatile int result = test_function(); 
stop = time(); 
elapsed = stop - start; 
+0

あなたの例の 'register volatile'は単に' volatile'とどのように違うのですか? – dasblinkenlight

+1

@dasblinkenlightプログラムが有効なので違いはありません。 – ecatmur

+0

揮発性キーワードの理解を深めることは、変数が指定されるたびに、変数が他のプロセスやスレッドやデバイスによって変更されている可能性があることをコンパイラに伝えることです。コンパイラが最適化を行うと、変数値がレジスタにロードされた場合、変数を変更するソースコードがコンパイラによって検出されるまで、レジスタの値を現在の値のコピーとして使用することができる。 Volatileは、この仮定が有効でないことをコンパイラーに通知します。 –

5

volatileオブジェクトがそのように変更してもよいことを意味しますコンパイラには予測不可能であり、registerはそのアドレスが取れないことを意味します。

オブジェクトが実際にプラットフォーム上のハードウェアレジスタである場合、両方の組み合わせが完璧な意味を持ちます。いくつかのコンパイラ(gccなど)では、そのような変数を特定のハードウェアレジスタに固定する拡張機能もあります。

このようなハードウェアレジスタは、他のコードによって変更される場合があります。そのため、コンパイラは現在の値について何も想定していない可能性があります。そのような場合には、const修飾子を追加することも意味をなさないでしょう。例えば、GCCの拡張

register uint32_t volatile const eax __asm__("eax"); 

であなたはいつでもeaxレジスタを検査するためのツールを持っていると思いますが、あなたは事故によってそれを変更することはできません。

+0

'volatile 'はまた、変数へのすべての書き込みが実際に起こらなければならないことを意味します。 –

+0

@ Torklingberg、 'register'変数への"書き込み "はどういう意味ですか?そのような変数には "記憶"のモデルがなく、 "読み込み"または "書き込み"のモデルもありません。 –

関連する問題