Skip to content

Files

Latest commit

7d79a5d · Dec 20, 2024

History

History
84 lines (61 loc) · 2.13 KB

is_sufficiently_aligned.md

File metadata and controls

84 lines (61 loc) · 2.13 KB

is_sufficiently_aligned

  • 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);
}

概要

ポインタ値が指定したアライメントを満たすか否かを返す。

事前条件

ポインタ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;
}
  • 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

処理系

関連項目

参照