最終更新日時: 2025年07月10日 10時26分30秒 (JST)
Koichi Murase が更新

履歴 編集

# alignof [N2341](C++11)

このページはC++11に採用された言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

## 概要

`alignof()`は、指定した型がメモリ上のどの位置に配置されるか（アライメント）取得する演算子である。「アライン オブ (align of)」と読む。

`sizeof()`と異なり`alignof()` は変数には使用できない。

例えば型`int`が4バイト境界の位置にアライメントされるシステムであれば、`alignof(int)`は4を返す。

## 仕様

- `alignof(型)`は、指定した型のアライメントのサイズを返す。戻り値の型は`std::size_t`である。

もっとも制約の弱い、すなわちアライメントのサイズが最小となる型は`char`, `signed char`, `unsigned char`であり、 もっとも制約の強い、すなわちアライメントのサイズが最大となる型は`std::max_align_t`である。

## 例

    #include <cstddef>
    #include <iostream>

    struct hoge {
      char c[63];
      short s;
      double i;
    };

    struct empty {
    };

    int main()
    {
      std::cout <<
        "std::max_align_t:  " << alignof(std::max_align_t) << std::endl <<
        "char:              " << alignof(char) << std::endl <<
        "int:               " << alignof(int) << std::endl <<
        "double:            " << alignof(double) << std::endl <<
        "struct hoge:       " << alignof(hoge) << std::endl <<
        "struct empty:      " << alignof(empty) << std::endl <<
        "char *:            " << alignof(char *) << std::endl;

      return 0;
    }

### 出力

x86向けLinux上で実行した場合。

    std::max_align_t:  8
    char:              1
    int:               4
    double:            8
    struct hoge:       4
    struct empty:      1
    char *:            4

## この機能が必要になった背景・経緯

C++03で型のアライメントサイズを得るにはコンパイラの拡張機能を利用するしかなく、コンパイラごとに異なる記述を行う必要があったが、C++11ではどのコンパイラでも同じ記述でアライメントサイズが取得できる。

## 検討されたほかの選択肢

N2341 からはわからない、恐らくないと思われる。

## 関連項目

- C++11 `alignas`
- `std::max_align_t`
- C++17 アライメント指定されたデータの動的メモリ確保

## 参照

- N2341 Adding Alignment Support to the C++ Programming Language / Wording