首頁  >  文章  >  後端開發  >  為什麼具有短成員的 C 結構體的大小並不總是成員大小的倍數?

為什麼具有短成員的 C 結構體的大小並不總是成員大小的倍數?

Barbara Streisand
Barbara Streisand原創
2024-10-26 13:00:29527瀏覽

Why is the size of a C struct with short members not always a multiple of the member size?

理解C 結構體中的記憶體對齊

記憶體對齊是C 程式設計中的重要概念,因為它會影響資料在記憶體中的儲存方式和由處理器存取。在結構體上下文中,記憶體對齊決定了結構體的各個成員在記憶體中的佈局方式。

考慮以下結構體:

<code class="c">typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
} myStruct;</code>

在記憶體對齊的 32 位元機器上通常設定為 4 位元組,人們預期該結構的總大小為 8 位元組。但是,sizeof(myStruct) 運算子僅傳回 6 個位元組。

之所以會出現差異,是因為結構體的每個成員都是無符號短整型,其大小為 2 個位元組。由於所有成員的大小相同,因此它們之間不會插入任何填充。結果,該結構體在記憶體中佔用了 6 個位元組。

現在,讓我們修改該結構體:

<code class="c">typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
    int i;
} myStruct;</code>

在這種情況下,存在一個int 成員,其大小為4 個位元組,更改結構體的記憶體對齊方式。 int 成員必須在 4 位元組邊界上對齊。由於它前面有 6 個字節,因此在 v3 和 i 之間插入 2 個位元組的填充。這使得結構體的總大小達到 12 個位元組,由 sizeof(myStruct) 確認。

總之,C 結構體中的記憶體對齊可確保成員在記憶體中正確對齊,以優化處理器效能並減少記憶體使用。類型僅與與類型本身一樣大的邊界對齊。當引入更大的類型時,它會設定整個結構的對齊方式,可能會引入填充來保持所需的對齊方式。

以上是為什麼具有短成員的 C 結構體的大小並不總是成員大小的倍數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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