首頁  >  文章  >  後端開發  >  為什麼 `sizeof(myStruct2)` 回傳 12 個位元組,而 `sizeof(myStruct1)` 回傳 6 個位元組?

為什麼 `sizeof(myStruct2)` 回傳 12 個位元組,而 `sizeof(myStruct1)` 回傳 6 個位元組?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-26 10:01:03398瀏覽

Why Does `sizeof(myStruct2)` Return 12 Bytes While `sizeof(myStruct1)` Returns 6 Bytes?

C 結構中的記憶體對齊

在處理 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn