namespace std {
template<size_t Alignment, class T>
bool is_sufficiently_aligned(T* ptr);
}
概要
ポインタ値が指定したアライメントを満たすか否かを返す。
事前条件
ポインタp
が、T
に類似(similar)した型のオブジェクトX
を指すこと。
戻り値
X
が少なくともAlignment
でアライメントされるならばtrue
。そうでなければfalse
。
例外
投げない
この機能が必要になった背景・経緯
この関数テンプレートは<mdspan>
ヘッダへのaligned_accessor
導入に伴って必要とされた機能である。
一方で、ポインタ値のアライメント要件を検査するユースケースは一般的と考えられたため、汎用ユーティリティとして<memory>
ヘッダに対して機能追加された。
例
#include <cassert>
#include <memory>
#include <new>
int main()
{
int *ptr = new(std::align_val_t{32}) int;
assert( std::is_sufficiently_aligned<32>(ptr) );
delete ptr;
}
出力
実装例
// 提案文書P2897R7より引用
template<size_t ByteAlignment, class ElementType>
bool is_sufficiently_aligned(ElementType* p)
{
return bit_cast<uintptr_t>(p) % ByteAlignment == 0;
}
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- Visual C++: ??