私はregisterキーワードが値を計算するためのレジスタを割り当て、volatileキーワードは変数の計算を実行するたびにメモリから値を読み込み、基本的にはコードを最適化しないことを理解します。したがって、変数にこれらのキーワードの両方が割り当てられていれば、基本的にはそれ自体が揮発性であることを意味するでしょうか?私は、サンプルコードを書くことによってその動作を理解することはできません。誰か光を当てることはできますか?Cで "volatile int i"をどのように動作させるのですか?
答えて
ストレージクラスは、プログラムがオブジェクトのアドレスを取得または使用しようとすると、診断を発行するために実装が必要である点を除いて、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;
あなたの例の 'register volatile'は単に' volatile'とどのように違うのですか? – dasblinkenlight
@dasblinkenlightプログラムが有効なので違いはありません。 – ecatmur
揮発性キーワードの理解を深めることは、変数が指定されるたびに、変数が他のプロセスやスレッドやデバイスによって変更されている可能性があることをコンパイラに伝えることです。コンパイラが最適化を行うと、変数値がレジスタにロードされた場合、変数を変更するソースコードがコンパイラによって検出されるまで、レジスタの値を現在の値のコピーとして使用することができる。 Volatileは、この仮定が有効でないことをコンパイラーに通知します。 –
volatile
オブジェクトがそのように変更してもよいことを意味しますコンパイラには予測不可能であり、register
はそのアドレスが取れないことを意味します。
オブジェクトが実際にプラットフォーム上のハードウェアレジスタである場合、両方の組み合わせが完璧な意味を持ちます。いくつかのコンパイラ(gccなど)では、そのような変数を特定のハードウェアレジスタに固定する拡張機能もあります。
このようなハードウェアレジスタは、他のコードによって変更される場合があります。そのため、コンパイラは現在の値について何も想定していない可能性があります。そのような場合には、const
修飾子を追加することも意味をなさないでしょう。例えば、GCCの拡張
register uint32_t volatile const eax __asm__("eax");
であなたはいつでもeax
レジスタを検査するためのツールを持っていると思いますが、あなたは事故によってそれを変更することはできません。
'volatile 'はまた、変数へのすべての書き込みが実際に起こらなければならないことを意味します。 –
@ Torklingberg、 'register'変数への"書き込み "はどういう意味ですか?そのような変数には "記憶"のモデルがなく、 "読み込み"または "書き込み"のモデルもありません。 –
- 1. C:*(volatile int *)foo
- 2. どのようにProgressBarを動作させるのですか?
- 3. ASPファイル。どのように動作させるのですか?
- 4. hg remove -I PATTERN、どのように動作するのですか?
- 5. volatileの例(JLS8/8.3.1.4 volatileフィールドのもの)が動作しませんか?
- 6. Cとアセンブリどのように動作するのですか?
- 7. このテンプレートコードはどのように動作させるのですか?
- 8. "volatile int * p"のようなpoint-to-volatileポインタが便利なのはなぜですか?
- 9. MACROSはどのようにCで動作しますか?
- 10. C#ThreadStatic + volatileメンバーが期待どおりに動作しない
- 11. このループはどのように動作させるのですか?
- 12. simple_formでenumをどのように動作させるのですか?
- 13. C *ではどのようにint *がboolですか?
- 14. cin.peek()はC++でどのように動作しますか?
- 15. 私のCプログラムでscanf_s()を正しく動作させるにはどうすればよいですか?
- 16. Poco :: RegularExpression C++で "\ n"をどのようにマッチさせるか?
- 17. どのように(0,0)から(8,8)までのMap [(Int、Int)、List [Int]]を作ることができますか?
- 18. どのようにPHPで選択ボタンを動作させる
- 19. "1 << i"のシフトはどのようにPythonで動作しますか?
- 20. upgrade_to_unique_lock + condition_variableをどのようにして動作させるか?
- 21. SignalRはRequireJSでどのように動作させるのですか?
- 22. Javaにおけるvolatileキーワードの動作
- 23. デリミタを動作させるにはどうすればよいですか?
- 24. WS_MAXIMIZEを動作させるにはどうすればよいですか?
- 25. write(byte []、int、int)メソッドはどのように動作していますか?
- 26. iPhoneをどのように振動させるのですか?
- 27. Boost.LexicalCastを動作させるにはどうすればよいですか?
- 28. Tryparseを動作させるにはどうすればよいですか?
- 29. このCSSレイアウトはどのように動作させるのですか?
- 30. デリゲートオブジェクトはC#でどのように作成されますか?
プラットフォームとコンパイラは何ですか?私は、最も一般的なコンパイラ(GCCなど)は 'register'を尊重するとは思わないのです。 – Joe
'register 'には、宣言された変数のアドレスを取ることができないという効果があります。 –
@ダニエル:私はあなたのポイントを理解していませんでした。ポインタでアクセスできると言っているのですか? – knightofhorizon