控制對齊

Version >= C++ 11

alignas 關鍵字可用於強制變數,類資料成員,類的宣告或定義,或列舉的宣告或定義,以獲得特定的對齊(如果支援)。它有兩種形式:

  • alignas(x),其中 x 是常量表示式,如果支援,則為實體提供對齊 x
  • alignas(T),其中 T 是一個型別,給實體一個等於 T 的對齊要求的對齊,即 alignof(T),如果支援的話。

如果將多個 alignas 說明符應用於同一實體,則應用最嚴格的說明符。

在這個例子中,保證緩衝區 buf 被適當地對齊以保持 int 物件,即使它的元素型別是 unsigned char,其可能具有較弱的對齊要求。

alignas(int) unsigned char buf[sizeof(int)];
new (buf) int(42);

alignas 不能用於為型別提供比沒有此宣告時型別更小的對齊:

alignas(1) int i; //Il-formed, unless `int` on this platform is aligned to 1 byte.
alignas(char) int j; //Il-formed, unless `int` has the same or smaller alignment than `char`.

alignas,當給定整數常量表示式時,必須給出有效的對齊方式。有效對齊始終為 2 的冪,且必須大於零。編譯器需要支援所有有效的對齊,直到 std::max_align_t 的對齊方式。它們可能支援比這更大的對齊,但是為這些物件分配記憶體的支援是有限的。對齊的上限取決於實現。

C++ 17 在 operator new 中提供直接支援,用於為過度對齊型別分配記憶體。