名稱空間
變體
操作

_Alignas (C11 起)(C23 中已棄用), alignas (C23 起)

來自 cppreference.com
< c‎ | 語言

宣告語法中作為型別說明符之一,用於修改正在宣告的物件的對齊要求

目錄

[編輯] 語法

_Alignas ( 表示式 ) (1) (C11 起)
alignas ( 表示式 ) (2) (自 C23 起)
_Alignas ( 型別 ) (3) (C11 起)
alignas ( 型別 ) (4) (自 C23 起)
表示式 - 任何整型常量表達式,其值為有效的對齊值或零
型別 - 任何型別名

關鍵字 _Alignas 也可作為方便的宏 alignas 使用,該宏在標頭檔案 <stdalign.h> 中可用。

(直至 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 起) 來控制。

[編輯] 關鍵字

alignas, _Alignas

[編輯] 示例

#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)

[編輯] 另請參閱

與任何其他標量型別具有相同對齊要求的型別
(typedef) [編輯]
_Alignof(C23 前)alignof(C23 起) 查詢物件的對齊要求
(運算子)
C++ 文件,關於 alignas 說明符