Namespaces
Variants

alignas specifier (since C++11)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - HTMLタグ、属性、
タグ内のテキストは翻訳していません
- C++固有の用語(Syntax、Explanation、Notes、Keywords、Example、Defect reports、References、See also)は原文のまま保持しています
- 数値や構造は完全に保持されています
- フォーマットとリンクは変更していません

構文

alignas( )
alignas( 型ID )
alignas( パック ... )
1) expression integral constant expression であり、ゼロに評価されるか、 alignment または拡張アラインメントの有効な値に評価されなければならない。
2) 次と同等: alignas ( alignof ( type-id ) )
3) 同じ宣言に適用される複数のalignas指定子と同等であり、それぞれが parameter pack の各メンバーに対応します。これは型または定数のparameter packのいずれかになります。

説明

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

  • クラスまたは構造体の class の宣言または定義;
  • 非ビットフィールドクラスデータメンバの宣言;
  • 変数の宣言(ただし以下には適用不可):
    • 関数パラメータ;
    • catch節の例外パラメータ。

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

宣言における最も厳格な(最大の) alignas が、いかなる alignas 指定子なしで持つべきアラインメント(すなわち、その自然なアラインメントや、同じオブジェクトまたは型の別の宣言における alignas よりも弱い場合)、プログラムは不適格となります:

struct alignas(8) S {};
struct alignas(1) U { S s; }; // エラー: alignas(1)がなければUのアライメントは8になっていた

ゼロ以外の無効なアライメント、例えば alignas ( 3 ) は ill-formed です。

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

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

注記

ISO C11規格以降、C言語は _Alignas キーワードを持ち、 alignas をヘッダーファイル <stdalign.h> 内でこのキーワードに展開するプリプロセッサマクロとして定義しています。

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

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

(C++20まで)

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

(C++20以降)

キーワード

alignas

#include <iostream>
// struct_float型のすべてのオブジェクトは
// alignof(float)境界(通常は4)にアラインされる:
struct alignas(float) struct_float
{
    // ここに定義を記述
};
// sse_t型のすべてのオブジェクトは32バイト境界にアラインされる:
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 Carries dependency属性 [dcl.attr.depend]
  • C++20 標準 (ISO/IEC 14882:2020):
  • 9.12.3 Carries dependency 属性 [dcl.attr.depend]
  • C++17規格 (ISO/IEC 14882:2017):
  • 10.6.3 Carries dependency属性 [dcl.attr.depend]
  • C++14規格 (ISO/IEC 14882:2014):
  • 7.6.4 依存関係伝播属性 [dcl.attr.depend]
  • C++11規格 (ISO/IEC 14882:2011):
  • 7.6.4 Carries dependency属性 [dcl.attr.depend]

関連項目

alignof (C++11) 型のアライメント要件を問い合わせる
(演算子)
型のアライメント要件を取得する
(クラステンプレート)
Cドキュメント for _Alignas, alignas