C++ - 揮発性、変更可能、明示的なキーワード

揮発性の

  • 宣言された型変数の表現は、コンパイラの未知の要因によって変更される可能性があります
    たとえば、オペレーティング システム、ハードウェア、その他のスレッドなど、変数がこのキーワードで宣言された後、コンパイラは変数のコードにアクセスするときに最適化されません。システムは、レジスタ内のバックアップを読み取るのではなく、常にデータが存在するメモリからデータを再読み取りします。
    マルチスレッドの複数のタスクで共有される変数は、 volatile として定義する必要があります

volatile は次の場所で使用されます

  • 他のプログラムによる検出のために割り込みサービス ルーチンで変更された変数には、volatile を追加する必要があります。
  • マルチタスク環境のタスク間で共有されるフラグは、揮発性を追加する必要があります
  • メモリマップされたハードウェア レジスタも通常は揮発性です。これは、レジスタへの読み取りと書き込みがそれぞれ異なる意味を持つ可能性があるためです。

マルチスレッド下では揮発性

2 つのスレッドが特定の変数を使用し、この変数の値が変更される場合、最適化コンパイラが変数をメモリから CPU レジスタにロードしないように、変数を volatile で宣言する必要があります

知らせ

不揮発性 int を揮発性 int に割り当てることはできますが、不揮発性オブジェクトを揮発性オブジェクトに割り当てることはできません。
  • volatile int と int はどちらも基本型であり、サイズと配置が同じであるため、直接代入できます。
  • 揮発性オブジェクトと不揮発性オブジェクトはユーザー定義型である場合があり、そのサイズと配置が異なる場合があるため、直接割り当てることはできません。
  • 揮発性オブジェクトの代入操作には、メモリ マップされたハードウェア レジスタなどの特殊なメモリ操作が含まれる場合があるため、通常の代入ステートメントは使用できません。
C++ の volatile 識別子を持つクラスは、そのインターフェイスのサブセット (クラスの実装者によって制御されるサブセット) にのみアクセスできます。

ユーザーは const_cast を使用して型インターフェイスへの完全なアクセスを取得することのみができ、const のような volatile はクラスからそのメンバーに渡されます。

可変

場合によっては、const 関数内のクラスの状態に関係のない一部のデータ メンバーを変更する必要がある場合、この関数を mutable で変更し、関数の後のキーワードの位置に配置する必要があります。

明示的な

Explicit キーワードは、クラス内のコンストラクター宣言をアップロードするためにのみ使用できます。また、Explicit によって変更されたコンストラクターのクラスには、対応する暗黙的な変換を含めることはできません。

おすすめ

転載: blog.csdn.net/qaaaaaaz/article/details/131147240