在處理 C 中的結構時,記憶體對齊在優化記憶體使用和效能方面起著至關重要的作用。如果您對以下兩個結構之間的記憶體對齊差異感到困惑:
<code class="c">typedef struct { unsigned short v1; unsigned short v2; unsigned short v3; } myStruct1; typedef struct { unsigned short v1; unsigned short v2; unsigned short v3; int i; } myStruct2;</code>
其中myStruct1 和myStruct2 具有相同的6 位元組組合資料大小,但myStruct2 使用以下命令報告大小為12 位元組sizeof(),答案在於記憶體對齊。
在大多數 32 位元機器上,對齊邊界通常為 4 個位元組。這意味著結構與 4 位元組的最接近倍數對齊。在 myStruct1 中,每個成員都是 2 個位元組,因此它們之間沒有插入任何 padding,實際大小仍為 6 個位元組。
但是在 myStruct2 中,增加 4 個位元組整數(int)需要一個4 個位元組對齊邊界。由於原始結構中的初始 6 位元組資料未與 4 位元組邊界對齊,因此在 v3 和 i 之間插入 2 位元組填充。此填充確保 i 從 4 個位元組邊界開始,從而導致 myStruct2 的總大小為 12 個位元組。
請記住,在大多數情況下,結構僅與其最大成員的邊界對齊。在本例中,myStruct2 中的 int 成員確定了對齊邊界,這解釋了兩個結構之間記憶體對齊的差異。
以上是為什麼 `sizeof(myStruct2)` 回傳 12 個位元組,而 `sizeof(myStruct1)` 回傳 6 個位元組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!