alignas
說明符 (C++11 起)
來自 cppreference.com
指定型別或物件的對齊要求。
目錄 |
[編輯] 語法
alignas( 表示式 ) |
|||||||||
alignas( 型別-id ) |
|||||||||
alignas( 包 ... ) |
|||||||||
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 起) |
[編輯] 關鍵詞
[編輯] 示例
執行此程式碼
#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++11) |
獲取型別的對齊要求 (類模板) |
C 文件 用於 _Alignas, alignas
|