揮発性メンバー関数の実用的な例を求めました。私が想像できる唯一の状況は非常に低レベルであるため、最初にメンバー関数を使用することを検討せず、揮発性参照によってアクセスされるデータメンバーを持つ単純な構造体であるため、考えられません。
ただし、質問に答えるために const volatile 関数を入れましょう。それぞれ 4 バイトの 2 つの整数を含むアドレス 0x378h のポートがあるとします。それからあなたは書くことができます
struct ints {
int first;
int second;
int getfirst() const volatile {
return first;
}
int getsecond() const volatile {
return second;
}
// note that you could also overload on volatile-ness, just like
// with const-ness
};
// could also be mapped by the linker.
ints const volatile &p = *reinterpret_cast<ints*>(0x378L);
あなたは述べています
私はそれらを変更していませんが、この抽象的なセマンティクス以外の別のことが変更される可能性があります。したがって、常にそのアドレスから実際のロードを行います。
実際には、volatileは、オブジェクトの値が最後に格納された値ではない可能性があることを示しますが、実際には不明であり、外部 (コンパイラによって監視できない) 条件によってその間に変更された可能性があります。したがって、揮発性オブジェクトから読み取る場合、コンパイラは正確な抽象セマンティクスをエミュレートする必要があり、最適化は実行しません。
a = 4;
a *= 2;
// can't be optimized to a = 8; if a is volatile because the abstract
// semantics described by the language contain two assignments and one load.
以下はすでに何をするかを決定してvolatile
います。すべてが1.9
標準の中にあります。それが話しているパラメータは、何らかの型の sizeof のように、実装で定義されたものです。
この国際標準のセマンティック記述は、パラメータ化された非決定論的抽象マシンを定義します。この国際規格は、適合する実装の構造に要件を課していません。特に、抽象マシンの構造をコピーまたはエミュレートする必要はありません。むしろ、以下で説明するように、抽象マシンの観察可能な動作をエミュレートする (のみ) ために、適合する実装が必要です。[...]
整形式プログラムを実行する適合実装は、同じプログラムと同じ入力を持つ抽象マシンの対応するインスタンスの可能な実行シーケンスの 1 つと同じ観測可能な動作を生成するものとします。[...]
抽象マシンの観察可能な動作は、揮発性データへの読み取りと書き込み、およびライブラリ I/O 関数の呼び出しのシーケンスです。