_Alignas (C11 起)(C23 中已棄用), alignas (C23 起)
來自 cppreference.com
在宣告語法中作為型別說明符之一,用於修改正在宣告的物件的對齊要求。
目錄 |
[編輯] 語法
_Alignas ( 表示式 ) |
(1) | (C11 起) | |||||||
alignas ( 表示式 ) |
(2) | (自 C23 起) | |||||||
_Alignas ( 型別 ) |
(3) | (C11 起) | |||||||
alignas ( 型別 ) |
(4) | (自 C23 起) | |||||||
表示式 | - | 任何整型常量表達式,其值為有效的對齊值或零 |
型別 | - | 任何型別名 |
關鍵字 |
(直至 C23) |
[編輯] 說明
_Alignas
(C23 前)alignas
(C23 起) 說明符只能用於宣告非位域且不具有 register 儲存類的物件。它不能用於函式引數宣告,也不能用於 typedef。
當用於宣告時,所宣告物件的對齊要求將被設定為
1,2) 表示式的結果,除非它為零
3,4) 型別的對齊要求,即 _Alignof(type)(C23 前)alignof(type)(C23 起)
除非這會削弱型別自然具有的對齊方式。
如果 表示式 的計算結果為零,則此說明符無效。
當同一宣告中出現多個 _Alignas
(C23 前)alignas
(C23 起) 說明符時,使用最嚴格的那個。
_Alignas
(C23 前)alignas
(C23 起) 說明符只需出現在物件的定義中,但如果任何宣告使用 _Alignas
(C23 前)alignas
(C23 起),它必須指定與定義中的 _Alignas
(C23 前)alignas
(C23 起) 相同的對齊方式。如果不同的翻譯單元為同一物件指定不同的對齊方式,則行為未定義。
[編輯] 注意
在 C++ 中,alignas
說明符也可以應用於類/結構體/聯合體型別和列舉的宣告。C 中不支援此功能,但結構體型別的對齊方式可以透過在成員宣告中使用 _Alignas
(C23 前)alignas
(C23 起) 來控制。
[編輯] 關鍵字
[編輯] 示例
執行此程式碼
#include <stdalign.h> #include <stdio.h> // every object of type struct sse_t will be aligned to 16-byte boundary // (note: needs support for DR 444) struct sse_t { alignas(16) float sse_data[4]; }; // every object of type struct data will be aligned to 128-byte boundary struct data { char x; alignas(128) char cacheline[128]; // over-aligned array of char, // not array of over-aligned chars }; int main(void) { printf("sizeof(data) = %zu (1 byte + 127 bytes padding + 128-byte array)\n", sizeof(struct data)); printf("alignment of sse_t is %zu\n", alignof(struct sse_t)); alignas(2048) struct data d; // this instance of data is aligned even stricter (void)d; // suppresses "maybe unused" warning }
輸出
sizeof(data) = 256 (1 byte + 127 bytes padding + 128-byte array) alignment of sse_t is 16
[編輯] 缺陷報告
以下行為改變的缺陷報告被追溯地應用於以前釋出的 C 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
DR 444 | C11 | 結構體和聯合體成員中不允許使用 _Alignas |
允許 |
[編輯] 參考
- C23 標準 (ISO/IEC 9899:2024)
- 6.7.5 對齊說明符(p:待定)
- 6.2.8 物件的對齊方式(p:待定)
- 7.15 對齊 <stdalign.h>(p:待定)
- C17 標準 (ISO/IEC 9899:2018)
- 6.7.5 對齊說明符(p:92)
- 6.2.8 物件的對齊方式(p:36-37)
- 7.15 對齊 <stdalign.h>(p:196)
- C11 標準 (ISO/IEC 9899:2011)
- 6.7.5 對齊說明符(p:127-128)
- 6.2.8 物件的對齊方式(p:48-49)
- 7.15 對齊 <stdalign.h>(p:268)
[編輯] 另請參閱
(C11) |
與任何其他標量型別具有相同對齊要求的型別 (typedef) |
_Alignof(C23 前)alignof(C23 起) | 查詢物件的對齊要求 (運算子) |
C++ 文件,關於
alignas 說明符 |