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