揮発性と可変性の違いについて質問があります。私は、2つの両方がそれが変更される可能性があることを意味していることに気づきました。ほかに何か?それらは同じものですか?違いは何ですか?それらはどこに適用できますか?なぜ2つのアイデアが提案されているのですか?それらを別の方法で使用する方法は?
どうもありがとう。
mutable
フィールドは、const
ポインタや参照を介してアクセスされるオブジェクト、またはオブジェクト内でも変更できるため、コンパイラはR/Oメモリにフィールドconst
を隠さないことを認識しています。場所は、コンパイラーが知らないコード(カーネルレベルのドライバーなど)によって変更できる場所であるvolatile
ため、コンパイラーは、値が「そのレジスタに最後にロードされてから変更されました。非常に異なる種類の無効な最適化を停止するために、非常に異なる種類の情報がコンパイラーに提供されます。
mutable
:mutableキーワードは、それを囲むconstステートメントをオーバーライドします。constオブジェクトの可変メンバーを変更できます。
volatile
:volatileキーワードは、実装に依存する修飾子であり、変数を宣言するときに使用されます。これにより、コンパイラーはこれらの変数を最適化できなくなります。Volatileは、値が予期しない方法で(つまり、割り込みによって)変更される可能性がある変数で使用する必要があります。これは、コンパイラーが実行する可能性のある最適化と競合する可能性があります。
それらは間違いなく同じものではありません。ミュータブルはconstと相互作用します。constポインターがある場合、通常はメンバーを変更できません。ミュータブルはそのルールに例外を提供します。
一方、揮発性は、プログラムによって行われた変更とはまったく関係ありません。これは、コンパイラの制御が及ばない理由でメモリが変更される可能性があることを意味します。したがって、コンパイラは毎回メモリアドレスを読み書きする必要があり、コンテンツをレジスタにキャッシュできません。
違いについての大雑把ですが効果的な考え方は次のとおりです。
マークされた変数をmutable
使用すると、宣言されたメソッドで変数を変更できますconst
。
マークされた変数はvolatile
、コードが指示するたびに変数の読み取り/書き込みを行う必要があることをコンパイラーに通知します(つまり、変数へのアクセスを最適化することはできません)。