最終更新日時(UTC): 2024年09月18日 05時54分15秒
Akira Takahashi が更新

履歴 編集

variable
<new>

# std::hardware_constructive_interference_size(C++17)

    namespace std {
      inline constexpr std::size_t hardware_constructive_interference_size = implementation-defined;
    }

## 概要

2つのオブジェクトに一時局所的にアクセスできる最大サイズ。

この変数と対になる`hardware_destructive_interference_size`は、各変数がそれぞれ別なキャッシュラインに乗るようアライメントを調整するものだが、この変数は、複数の変数を意図的に同じキャッシュラインに乗せるためのアライメントサイズである。

## 備考

- この変数の値は、`alignof(max_align_t)`以上である
- 実装上、`hardware_constructive_interference_size`と`hardware_destructive_interference_size`は同値になるはずだが、利用目的によって名前を使い分けるために分かれている

## 例

    #include <iostream>
    #include <new>

    struct X {
      int a;
      int b;
    };

    // Xクラスのメンバ変数aとbが、同じキャッシュラインに乗ることを意図する
    static_assert(sizeof(X) <= std::hardware_constructive_interference_size);

    int main()
    {
      std::cout << "hardware_constructive_interference_size : "
                << std::hardware_constructive_interference_size
                << std::endl;
    }

### 出力例

    hardware_constructive_interference_size : 64

## バージョン

### 言語

- C++17

### 処理系

- Clang: 19 ✅
- GCC: 12.1 ✅
- Visual C++: 2019 ✅

## 参照

- N4523 `constexpr std::thread::hardware_{true,false}_sharing_size`
- P0154R0 `constexpr std::hardware_{constructive,destructive}_interference_size`
- P0154R1 `constexpr std::hardware_{constructive,destructive}_interference_size`
- Understanding `std::hardware_destructive_interference_size` and `std::hardware_constructive_interference_size` - Stack Overflow
  - 設計についての作者JF Bastien氏からのコメントがある
  - WebAssemblyなどの仮想環境ではターゲットアーキテクチャが実行時に決まるため、実行時の値もあるとよいだろう、とのコメントもある
- [RFC] C++17 hardware constructive / destructive interference size - Clang Developers Mailing list