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
andstd::hardware_constructive_interference_size
- Stack Overflow- 設計についての作者JF Bastien氏からのコメントがある
- WebAssemblyなどの仮想環境ではターゲットアーキテクチャが実行時に決まるため、実行時の値もあるとよいだろう、とのコメントもある
- [RFC] C++17 hardware constructive / destructive interference size - Clang Developers Mailing list