最終更新日時: 2024年12月20日 17時46分04秒 (JST)
yoh が更新

履歴 編集

function template
<memory>

# std::is_sufficiently_aligned(C++26)

    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++: ??

## 関連項目

- `assume_aligned`
- アライメント指定されたデータの動的メモリ確保

## 参照

- P2897R7 `aligned_accessor`: An mdspan accessor expressing pointer over-alignment