最終更新日時(UTC): 2025年10月10日 04時00分13秒
Akira Takahashi が更新

履歴 編集

function template
<atomic>

# std::atomic_store_add(C++26)

    namespace std {
      template <class T>
      void
        atomic_store_add(
          volatile atomic<T>* object,
          typename atomic<T>::difference_type operand) noexcept; // (1) C++26

      template <class T>
      constexpr void
        atomic_store_add(
          atomic<T>* object,
          typename atomic<T>::difference_type operand) noexcept; // (2) C++26
    }

## 概要

値を読み込まずにアトミックに値を加算する。

この関数は、`atomic_fetch_add()`と異なり、現在の (古い) 値を読み込むことなく現在の値に演算を行うため、高速に動作する。ただし変更前の古い値は戻り値として取得できない。

## テンプレートパラメータ制約

- 型`T`がオブジェクト型であること。型`T`が`void*`や関数ポインタであってはならない
- (1) :
  - `atomic<T>::is_always_lock_free`が`true`であること

## 事前条件

- `order`は、以下のいずれかであること
  - `memory_order_relaxed`
  - `memory_order_release`
  - `memory_order_seq_cst`

## 効果

`memory_order_seq_cst`のメモリオーダーにしたがって、現在の値に`operand`を加算した値でアトミックに置き換える

## 戻り値

なし

## 例外

投げない

## 備考

符号付き整数型に対しては、2の補数表現による演算が行われ、未定義動作はない。アドレス型に関しては結果として未定義アドレスになる場合があるが、それ以外の未定義動作はない。

## 例

    #include <iostream>
    #include <atomic>

    int main()
    {
      std::atomic<int> x(3);

      std::atomic_store_add(&x, 2);

      std::cout << x.load() << std::endl;
    }

### 出力

    5

## バージョン

### 言語

- C++26

### 処理系

- Clang: 21 ❌
- GCC: 15 ❌
- Visual C++: 2022 Update 13 ❌

## 参照

- P3111R8 Atomic Reduction Operations