首頁 >後端開發 >Golang >為什麼 Go 結構中不同的欄位順序會導致大小不同?

為什麼 Go 結構中不同的欄位順序會導致大小不同?

Susan Sarandon
Susan Sarandon原創
2024-12-05 01:36:10468瀏覽

Why Do Different Field Orders in Go Structs Result in Varying Sizes?

如果字段順序不同,結構體的大小也不同

1.結構體大小

總結:依結構體中字段的順序添加不同的隱式填充,從而影響其大小。

不同的架構需要不同的記憶體對齊方式位址。例如,在提供的程式碼中,假設目標架構是386,其中alignof int64是8位元組。

在struct A中,由於第一個欄位是bool,所以有一個7位元組的隱式填入 A.a 之後,以確保類型為 int64 的 A.b 從 8 位元組對齊的位址開始。這個填充是必要的,因為結構體本身是對齊到 8 位元組的。

然而,在結構體 B 中,B.a 之後只有 3 個位元組的隱式填充,因為它後面跟著一個 int 類型的欄位(其中有大小為 4 位元組)而不是 int64。

2。零大小值

Go 規格規定,如果結構體或陣列類型不包含大小大於零的欄位或元素,則其大小為零。

這表示不同的零- size 變數在記憶體中可能具有相同的位址。目前的實作遵循此規則,因此不會為大小為零的類型的值分配內存,包括空的 struct struct{} 和零長度的數組。

例如,在提供的程式碼中,C 是零大小的結構。因此,不會為 C 的實例分配記憶體。

以上是為什麼 Go 結構中不同的欄位順序會導致大小不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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