91

揮発性と可変性の違いについて質問があります。私は、2つの両方がそれが変更される可能性があることを意味していることに気づきました。ほかに何か?それらは同じものですか?違いは何ですか?それらはどこに適用できますか?なぜ2つのアイデアが提案されているのですか?それらを別の方法で使用する方法は?

どうもありがとう。

4

6 に答える 6

118

mutableフィールドは、constポインタや参照を介してアクセスされるオブジェクト、またはオブジェクト内でも変更できるため、コンパイラはR/Oメモリにフィールドconstを隠さないことを認識しています。場所は、コンパイラーが知らないコード(カーネルレベルのドライバーなど)によって変更できる場所であるvolatileため、コンパイラーは、値が「そのレジスタに最後にロードされてから変更されました。非常に異なる種類の無効な最適化を停止するために、非常に異なる種類の情報がコンパイラーに提供されます。

于 2010-03-15T02:15:29.323 に答える
28

mutable:mutableキーワードは、それを囲むconstステートメントをオーバーライドします。constオブジェクトの可変メンバーを変更できます。

volatile:volatileキーワードは、実装に依存する修飾子であり、変数を宣言するときに使用されます。これにより、コンパイラーはこれらの変数を最適化できなくなります。Volatileは、値が予期しない方法で(つまり、割り込みによって)変更される可能性がある変数で使用する必要があります。これは、コンパイラーが実行する可能性のある最適化と競合する可能性があります。

ソース

于 2010-03-15T02:15:24.147 に答える
22

それらは間違いなく同じものではありません。ミュータブルはconstと相互作用します。constポインターがある場合、通常はメンバーを変更できません。ミュータブルはそのルールに例外を提供します。

一方、揮発性は、プログラムによって行われた変更とはまったく関係ありません。これは、コンパイラの制御が及ばない理由でメモリが変更される可能性があることを意味します。したがって、コンパイラは毎回メモリアドレスを読み書きする必要があり、コンテンツをレジスタにキャッシュできません。

于 2010-03-15T02:14:50.170 に答える
17

違いについての大雑把ですが効果的な考え方は次のとおりです。

  • コンパイラは、可変オブジェクトがいつ変更されるかを認識しています。
  • コンパイラは、揮発性オブジェクトがいつ変更されるかを知ることができません。
于 2010-03-15T02:30:45.067 に答える
11

マークされた変数をmutable使用すると、宣言されたメソッドで変数を変更できますconst

マークされた変数はvolatile、コードが指示するたびに変数の読み取り/書き込みを行う必要があることをコンパイラーに通知します(つまり、変数へのアクセスを最適化することはできません)。

于 2010-03-15T02:15:56.623 に答える