名稱空間
變體
操作

alignas 說明符 (C++11 起)

來自 cppreference.com
< cpp‎ | 語言
 
 
C++ 語言
表示式
替代表示
字面量
布林字面量 - 整數字面量 - 浮點數字面量
字元字面量 - 字串字面量 - 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 說明符,每個引數包成員一個,引數包可以是型別或非型別引數包。

[編輯] 解釋

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++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
CWG 1437 C++11 alignas 可用於別名宣告 已禁止
CWG 2354 C++11 alignas 可應用於列舉宣告 已禁止

[編輯] 參考

  • C++23 標準 (ISO/IEC 14882:2024)
  • 9.12.4 攜帶依賴屬性 [dcl.attr.depend]
  • C++20 標準 (ISO/IEC 14882:2020)
  • 9.12.3 攜帶依賴屬性 [dcl.attr.depend]
  • C++17 標準 (ISO/IEC 14882:2017)
  • 10.6.3 攜帶依賴屬性 [dcl.attr.depend]
  • C++14 標準 (ISO/IEC 14882:2014)
  • 7.6.4 攜帶依賴屬性 [dcl.attr.depend]
  • C++11 標準 (ISO/IEC 14882:2011)
  • 7.6.4 攜帶依賴屬性 [dcl.attr.depend]

[編輯] 另見

alignof (C++11) 查詢型別的對齊要求
(運算子)[編輯]
獲取型別的對齊要求
(類模板) [編輯]
C 文件 用於 _Alignas, alignas