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 個位元組(6 個位元組的 Shorts 資料、2 個位元組的 padding 和 4 個位元組的 int 資料)。
因此,兩個結構體之間的記憶體大小差異來自其成員類型的對齊要求。在第一個結構中,對齊邊界由短成員本身滿足,而在第二個結構中,需要額外的填充來滿足 int 成員的對齊邊界。
以上是對於具有三個「unsigned Short」成員的結構,為什麼「sizeof(myStruct)」會傳回 6 個位元組而不是 8 個位元組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!