總結:依結構體中字段的順序添加不同的隱式填充,從而影響其大小。
不同的架構需要不同的記憶體對齊方式位址。例如,在提供的程式碼中,假設目標架構是386,其中alignof int64是8位元組。
在struct A中,由於第一個欄位是bool,所以有一個7位元組的隱式填入 A.a 之後,以確保類型為 int64 的 A.b 從 8 位元組對齊的位址開始。這個填充是必要的,因為結構體本身是對齊到 8 位元組的。
然而,在結構體 B 中,B.a 之後只有 3 個位元組的隱式填充,因為它後面跟著一個 int 類型的欄位(其中有大小為 4 位元組)而不是 int64。
Go 規格規定,如果結構體或陣列類型不包含大小大於零的欄位或元素,則其大小為零。
這表示不同的零- size 變數在記憶體中可能具有相同的位址。目前的實作遵循此規則,因此不會為大小為零的類型的值分配內存,包括空的 struct struct{} 和零長度的數組。
例如,在提供的程式碼中,C 是零大小的結構。因此,不會為 C 的實例分配記憶體。
以上是為什麼 Go 結構中不同的欄位順序會導致大小不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!