7

現在のドラフトからの次の抜粋は、私が何を意味するかを示しています。

namespace std {
    typedef struct atomic_bool {
        bool is_lock_free() const volatile;
        bool is_lock_free() const;
        void store(bool, memory_order = memory_order_seq_cst) volatile;
        void store(bool, memory_order = memory_order_seq_cst);
        bool load(memory_order = memory_order_seq_cst) const volatile;
        bool load(memory_order = memory_order_seq_cst) const;
        operator bool() const volatile;
        operator bool() const;
        bool exchange(bool, memory_order = memory_order_seq_cst) volatile;
        bool exchange(bool, memory_order = memory_order_seq_cst);
        bool compare_exchange_weak(bool&, bool, memory_order, memory_order) volatile;
        bool compare_exchange_weak(bool&, bool, memory_order, memory_order);
        bool compare_exchange_strong(bool&, bool, memory_order, memory_order) volatile;
        bool compare_exchange_strong(bool&, bool, memory_order, memory_order);
        bool compare_exchange_weak(bool&, bool, memory_order = memory_order_seq_cst) volatile;
        bool compare_exchange_weak(bool&, bool, memory_order = memory_order_seq_cst);
        bool compare_exchange_strong(bool&, bool, memory_order = memory_order_seq_cst) volatile;
        bool compare_exchange_strong(bool&, bool, memory_order = memory_order_seq_cst);
        atomic_bool() = default;
        constexpr atomic_bool(bool);
        atomic_bool(const atomic_bool&) = delete;
        atomic_bool& operator=(const atomic_bool&) = delete;
        atomic_bool& operator=(const atomic_bool&) volatile = delete;
        bool operator=(bool) volatile;
    } atomic_bool;
}

揮発性は推移的です。したがって、揮発性オブジェクトから非揮発性メンバー関数を呼び出すことはできません。一方、非揮発性オブジェクトから揮発性メンバー関数を呼び出すことは許可されています。

では、アトミック クラスの揮発性メンバー関数と非揮発性メンバー関数の間に実装の違いはありますか? 言い換えれば、不揮発性オーバーロードの必要性はありますか?

4

2 に答える 2

4

効率的な理由から、揮発性のオーバーロードが存在すると思います。C++0x では、揮発性の読み取りと書き込みは、本質的に不揮発性の読み取りと書き込みよりもコストがかかります。これは、メモリ モデルが揮発性変数の値のキャッシュを防止するいくつかの厳しい要件を課しているためです。すべての関数が volatile としてのみマークされている場合、コードはパフォーマンスを向上させる特定の最適化を必ずしも行うことができません。この区別により、コンパイラは、可能な場合は不揮発性の読み取りと書き込みを最適化し、揮発性の読み取りと書き込みが必要な場合は適切に機能を低下させることができます。

于 2011-02-02T04:52:45.947 に答える
-1

まず、揮発性の std::atomic を作成するのは冗長に思えます。実際、便利な状況を想像できます。操作したい固定デバイス (メモリ) アドレスがあると仮定します。std::atomic_xxx クラスと std::atomic<> テンプレート クラスのサイズは、対応する組み込み型と同じサイズでなければならないため、両方を処理する必要がある場合があります。メモリの順序付けを行い、アトミック オブジェクトへのアクセスが決して最適化されないようにします。したがって、次のように宣言できます。

std::atomic<long> volatile* vmem_first4 = reinterpret_cast<std::atomic<long> volatile*>(0xxB8000);
于 2011-02-03T04:13:32.707 に答える