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