名前空間
変種
操作

alignas 指定子 (C++11 以降)

From cppreference.com
< cpp‎ | language
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点数
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 

型またはオブジェクトのアライメント要件を指定します。

目次

[編集] 構文

alignas( )
alignas( 型ID )
alignas( パック ... )
1) は、ゼロまたはアライメントまたは拡張アライメントの有効な値に評価される整数定数式でなければなりません。
2) alignas(alignof( 型ID )) と同等です。
3) 同じ宣言に複数の alignas 指定子が適用されることと同等であり、パラメータパックの各メンバーに対して1つずつ適用されます。パラメータパックは型または非型パラメータパックのいずれかです。

[編集] 説明

alignas 指定子は以下に適用できます。

  • クラスの宣言または定義;
  • 非ビットフィールドクラスデータメンバーの宣言;
  • 変数宣言。ただし、以下には適用できません。
    • 関数パラメータ;
    • catch句の例外パラメータ。

そのような宣言によって宣言されたオブジェクトまたは型は、型の自然なアライメントを弱めない限り、宣言で使用されているすべての alignas 指定子の最も厳密な(最大の)非ゼロに等しいアライメント要件を持ちます。

宣言上の最も厳密な(最大の)alignas が、alignas 指定子なしで持っていたであろうアライメント(つまり、その自然なアライメントよりも弱い、または同じオブジェクトや型の別の宣言上の alignas よりも弱い)よりも弱い場合、プログラムは不正です。

struct alignas(8) S {};
struct alignas(1) U { S s; }; // error: alignment of U would have been 8 without alignas(1)

alignas(3) のような無効な非ゼロアライメントは不正です。

同じ宣言で別のalignasよりも弱い有効な非ゼロアライメントは無視されます。

alignas(0) は常に無視されます。

[編集] 備考

ISO C11 標準以降、C 言語には_Alignasキーワードがあり、ヘッダー<stdalign.h>でキーワードに展開されるプリプロセッサマクロとしてalignasを定義しています。

C++では、これはキーワードであり、

ヘッダー<stdalign.h><cstdalign>はそのようなマクロを定義しません。ただし、マクロ定数__alignas_is_definedを定義します。

(C++20まで)

ヘッダー<stdalign.h>はそのようなマクロを定義しません。ただし、マクロ定数__alignas_is_definedを定義します。

(C++20以降)

[編集] キーワード

alignas

[編集]

#include <iostream>
 
// Every object of type struct_float will be aligned
// to alignof(float) boundary (usually 4):
struct alignas(float) struct_float
{
    // your definition here
};
 
// Every object of type sse_t will be aligned to 32-byte boundary:
struct alignas(32) sse_t
{
    float sse_data[4];
};
 
int main()
{
    struct default_aligned
    {
        float data[4];
    } a, b, c;
    sse_t x, y, z;
 
    std::cout
        << "alignof(struct_float) = " << alignof(struct_float) << '\n'
        << "sizeof(sse_t) = " << sizeof(sse_t) << '\n'
        << "alignof(sse_t) = " << alignof(sse_t) << '\n'
        << std::hex << std::showbase
        << "&a: " << &a << "\n"
           "&b: " << &b << "\n"
           "&c: " << &c << "\n"
           "&x: " << &x << "\n"
           "&y: " << &y << "\n"
           "&z: " << &z << '\n';
}

実行結果の例

alignof(struct_float) = 4
sizeof(sse_t) = 32
alignof(sse_t) = 32
&a: 0x7fffcec89930
&b: 0x7fffcec89940
&c: 0x7fffcec89950
&x: 0x7fffcec89960
&y: 0x7fffcec89980
&z: 0x7fffcec899a0

[編集] 欠陥レポート

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
CWG 1437 C++11 alignasはエイリアス宣言で使用できる 禁止された
CWG 2354 C++11 alignasは列挙型の宣言に適用できる 禁止された

[編集] 参照

  • C++23標準 (ISO/IEC 14882:2024)
  • 9.12.4 依存性属性を持つ [dcl.attr.depend]
  • C++20 standard (ISO/IEC 14882:2020)
  • 9.12.3 依存性属性を持つ [dcl.attr.depend]
  • C++17 standard (ISO/IEC 14882:2017)
  • 10.6.3 依存性属性を持つ [dcl.attr.depend]
  • C++14 standard (ISO/IEC 14882:2014)
  • 7.6.4 依存性属性を持つ [dcl.attr.depend]
  • C++11 standard (ISO/IEC 14882:2011)
  • 7.6.4 依存性属性を持つ [dcl.attr.depend]

[編集] 関連項目

alignof (C++11) 型のアライメント要件を問い合わせる
(演算子)[編集]
型のアライメント要件を取得する
(クラステンプレート) [編集]
C ドキュメント for _Alignas, alignas
English 日本語 中文(简体) 中文(繁體)