- memory[meta header]
- function template[meta id-type]
- std[meta namespace]
- cpp26[meta cpp]
namespace std {
template<size_t Alignment, class T>
bool is_sufficiently_aligned(T* ptr);
}ポインタ値が指定したアライメントを満たすか否かを返す。
Alignmentが2の累乗であること。
ポインタ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) );
// アライメント指定で確保したため、対応する解放関数を明示的に呼び出す
::operator delete(ptr, std::align_val_t{32});
}- std::is_sufficiently_aligned[color ff0000]
- std::align_val_t[link /reference/new/align_val_t.md]
// 提案文書P2897R7より引用
template<size_t ByteAlignment, class ElementType>
bool is_sufficiently_aligned(ElementType* p)
{
return bit_cast<uintptr_t>(p) % ByteAlignment == 0;
}- bit_cast[link /reference/bit/bit_cast.md]
- C++26
- Clang: 21.1.7 [mark verified]
- GCC: ??
- Visual C++: ??
- P2897R7
aligned_accessor: An mdspan accessor expressing pointer over-alignment - LWG Issue 4286. Some more feature-test macros for fully freestanding features are not marked freestanding
- C++26で、この関数がフリースタンディング処理系でも使用できる(フリースタンディング機能である)ことが明示された
- LWG Issue 4290. Missing Mandates clauses on
is_sufficiently_aligned- C++26で、
Alignmentが2の累乗であることの適格要件が追加された
- C++26で、