C++的alignof關鍵字有什么作用?怎么用?

alignof 是 c++++ 中用于獲取類型或對象對齊要求的關鍵字,其返回值為 std::size_t 類型,表示該類型在內存中按多少字節對齊;1. 基本用法包括 alignof(type) 和 alignof(decltype(variable)),可查看類型的對齊邊界;2. 對齊影響結構體內存布局,編譯器會插入填充字節以滿足成員的對齊要求,進而影響結構體大小;3. 與 alignas 搭配使用時,可驗證手動設置的對齊是否生效;4. 實際應用場景包括性能優化、跨平臺開發、內存池設計以及與硬件通信等需要嚴格對齊的場合。

C++的alignof關鍵字有什么作用?怎么用?

alignof 是 c++ 中的一個關鍵字,它的作用是獲取某個類型或對象的對齊要求(alignment requirement),也就是這個類型在內存中需要按照多少字節對齊。這在處理底層內存操作、結構體內存布局優化或者與硬件交互時非常有用。

基本用法

你可以使用 alignof 來查看一個類型或變量的對齊方式,語法如下:

alignof(type);

或者對于變量:

立即學習C++免費學習筆記(深入)”;

decltype(auto) alignment = alignof(decltype(variable));

它返回的是一個 std::size_t 類型的值,表示該類型的對齊邊界,單位是字節。

比如:

#include <iostream>  int main() {     std::cout << "alignof(int): " << alignof(int) << std::endl;     std::cout << "alignof(double): " << alignof(double) << std::endl; }

輸出可能是:

alignof(int): 4 alignof(double): 8

說明 int 需要按 4 字節對齊,而 double 按 8 字節對齊。


對齊有什么實際影響?

影響結構體大小

你可能會發現,結構體的實際大小往往比所有成員加起來更大,這是因為編譯器會根據各個成員的對齊要求插入填充字節(padding)來滿足對齊規則。

例如:

struct Example {     char a;     int b; };

理論上 char 是 1 字節,int 是 4 字節,總共 5 字節。但因為 int 要求 4 字節對齊,所以在 a 后面會插入 3 個填充字節,使得整個結構體大小為 8 字節。

你可以用 alignof(Example) 看出這個結構體的對齊要求是 4(取決于其中最大對齊要求的成員)。


和 alignas 的關系

C++11 還引入了 alignas 關鍵字,用于指定自定義類型的對齊方式。alignof 可以用來驗證你設置的對齊是否生效。

比如:

struct alignas(16) MyStruct {     int x;     double y; };  std::cout << "alignof(MyStruct): " << alignof(MyStruct) << std::endl;

輸出應該是:

alignof(MyStruct): 16

即使結構體本身的最大對齊要求小于 16,你也強制讓它按 16 字節對齊。


實際應用場景

  • 性能優化:某些 CPU 架構對未對齊訪問支持不好,強制對齊可以提升性能。
  • 跨平臺開發:不同平臺的默認對齊可能不同,通過 alignof 可以統一判斷。
  • 內存池設計:分配內存時要考慮對齊,確保不同類型都能正確放置。
  • 與硬件通信:DMA 或寄存器訪問時通常有嚴格的對齊要求。

常見做法是在分配內存時手動調整對齊:

void* operator new(std::size_t size, std::align_val_t align) {     return std::aligned_alloc(static_cast<std::size_t>(align), size); }

這樣能確保分配出來的內存符合特定的對齊要求。


基本上就這些。alignof 不復雜,但在系統級編程和性能敏感場景下是個很有用的小工具

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享