C 結構中的記憶體對齊:了解大小差異
使用C 結構時,記憶體對齊在決定實際大小方面起著至關重要的作用記憶體中結構體的大小。記憶體對齊是指將資料結構放置在可被特定邊界整除的記憶體位址中。這確保了高效的數據存取和效能優化。
考慮一個 32 位元機器,其中記憶體對齊通常設定為 4 位元組。在這種情況下,由多個無符號短成員組成的結構體,例如:
typedef struct { unsigned short v1; unsigned short v2; unsigned short v3; } myStruct;
人們預期結構的記憶體大小為 8 位元組(3 x 2 位元組)。但是,sizeof(myStruct) 運算子僅傳回 6 個位元組。這種差異可以歸因於對齊要求。
在第一個範例中,每個短成員佔用 2 個位元組。由於對齊邊界是 4 個位元組,因此成員之間不會插入任何填充。因此,總大小保持在 6 個位元組。
相反,向結構中引入 int 成員(如下所示)會改變對齊行為:
typedef struct { unsigned short v1; unsigned short v2; unsigned short v3; int i; } myStruct;
在這種情況下,int 成員需要 4 位元組對齊邊界。為了確保滿足此要求,在最後一個無符號短成員 (v3) 和 int 成員 (i) 之間插入 2 個位元組的填充。這導致總大小為 12 個位元組(shorts 中的 6 個位元組的資料、2 個位元組的 padding 和 int 中的 4 個位元組的資料)。
因此,兩個結構之間的記憶體大小差異來自其成員類型的對齊要求。在第一個結構中,對齊邊界由短成員本身滿足,而在第二個結構中,需要額外的填充來滿足 int 成員的對齊邊界。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3