0

私は脳のけいれんを起こしている:

struct MyStruct
{
    int x;

    ...

    inline int getX1() const { return x; }
    inline int getX2() const volatile { return x; }
};

volatile MyStruct myStruct;

myStruct.getX1()揮発性の構造体/クラスで呼び出されるメソッドはvolatileそれらのメソッドに修飾子を持っている必要があるため、コンパイラーはmyStruct.getX2()を呼び出せ、呼び出すことはできないことを理解しています。

私の質問は次のとおりです。そのようなクラスを作成し、他のソフトウェアルーチンで使用するために公開する場合、メソッドに揮発性修飾子を追加する理由と追加しない理由は何ですか?

タグ付けされたメソッドは、最適化の目的で、volatileそのメンバーのいずれもがタグ付けされていないとコンパイラに指示するためですが、メソッドがタグ付けされていない場合は、タグ付けされていないメンバーを最適化できますか?volatilevolatilevolatile

4

2 に答える 2

3

標準では、標準クラスのメンバー関数は提供されていないvolatileため、通常の状況ではどちらも使用しないでください。

最後の段落の意味については正しいです。constメンバー関数と同様に、volatileメンバー関数thisは揮発性へのポインターです。そのため、揮発性メモリ アクセスを実装するために実装が何を行っても (まず、さまざまな種類の最適化を無効にします) this、.

実際には揮発性であるかどうvolatileかかわらず、一部のメモリをラップするクラスにメンバー関数を提供するだけの価値があると思います。その後、ユーザーは該当するオブジェクトまたは非オブジェクトを作成できます。メモリが確実に揮発性である必要がある場合は、データメンバーを持つ非オブジェクトの方が良いと思います。volatilevolatilevolatilevolatile

今、私は実際の使用を想像しようとしています - ハードウェアまたはあなたが書いた割り込みによって更新されるマジックアドレスの上に作成できる「カウンター」クラスです(この場合、揮発性を作成できます配置が新しいインスタンス) だけでなく、「通常の」コードからの呼び出しによってのみ更新されるユースケースもあります (この場合、非揮発性インスタンスになる可能性があります)。どちらの場合も、データ メンバーを volatile にすることで「パフォーマンス ヒット」が発生するだけです。他に害はないからです。ただし、同じコードを含む非バージョンのメンバー関数を提供することもできます。そのうちの 1 つは最適化され、もう 1 つは最適化されません。volatilevolatile

于 2012-01-25T17:06:08.207 に答える
1

volatile のタグが付けられたメソッドは、最適化のために、そのメンバーのいずれもが volatile でないと想定しないようにコンパイラに指示するためですか?

はい。

volatile関数では、*thisオブジェクトはになります。これvolatileは、クラスのすべての非静的メンバーが になることを意味します。関数とvolatile同様に、オブジェクトは、クラスのすべての非静的メンバーが になることを意味します。const*thisconstconst

コンパイルは、volatile関数内のメンバーを含むコードを積極的に最適化することを控えています。

于 2012-01-25T17:05:11.483 に答える