是的。
結構體默認是對齊的?。結構體對齊是為了優化內存訪問速度和減少CPU訪問內存時的延遲。結構體對齊的規則如下:
-
某數據類型的變量存放的地址需要按有效對齊字節剩下的字節數可以被該數據類型所占字節數整除,char可以放在任意位置,int存放在剩下字節數可以被4整除的位置。這個對齊規則是內部一定的
-
結構體的大小一定要為有效對齊值的整數倍
-
當沒有明確指明時,以結構體中最長的成員的長度來對齊,注意!數組成員個數并不影響有效對齊值,只是數組類型大小和其他成員比較取最大。但是當然數組成員總占用內存也要遵循字節對齊
-
當用#pragma pack(n)指定時,以n和最長成員中長度較小的值來對齊。
比如:
#include <iostream>
struct {
??? char a;
??? int b;
}aa;
int main()
{
??? std::cout << sizeof(aa)<<std::endl;
}
結果輸出是8。
禁止自動對齊:
#pragma pack(1) 將對齊設置為1字節,這意味著所有的成員變量都將按照1字節對齊,不會有任何填充字節。這在處理網絡協議或文件格式時非常有用,因為它可以確保結構體的布局與協議或文件格式嚴格匹配。
#pragma pack(1)
struct TCPHEADER
{
short SrcPort; // 16位源端口號
short DstPort; // 16位目的端口號
// ... 其他成員變量
};
#pragma pack()
相比之下,#pragma pack(push, 1) 不僅將當前的對齊設置為1字節,還將之前的對齊設置壓入一個內部堆棧。這樣,當你使用 #pragma pack(pop) 時,可以恢復到之前的對齊設置。這在你只想臨時改變對齊設置的情況下非常有用,因為它允許你在代碼的不同部分使用不同的對齊策略,而不會影響全局的對齊設置。