在提供的程式碼中,兩個結構體A 和B 具有相同的欄位但不同的欄位順序,表現出不同的大小。原因如下:
資料型別的記憶體對齊要求規定欄位的位址必須是特定值的倍數。對於 int64 字段,這個倍數是 8 個位元組。
在 struct A 中,第一個欄位是 bool,佔用 1 個位元組。為了在 8 位元組邊界上對齊後續的 int64 字段,在 a 之後添加 7 位元組隱式填充。
在 struct B 中,第一個欄位是 int64 類型的 b。由於已經對齊,因此在 a 之後只需要 3 個位元組的隱式填充來對齊後面的 int 字段,該字段需要 4 個位元組。
由於這種隱式填充, A 為24 個位元組(a 為1 個位元組,b 為8 個位元組,以及15 個位元組的填充) 。同時,B 為 16 位元組(a 1 字節,填入 3 字節,b 8 字節,c 4 位元組)。
結構體 C 已完全聲明空,導致大小為 0 位元組。根據 Go 語言規範,沒有大於零的欄位的結構的大小為零。
對於零大小值,該語言允許相同的記憶體位址可重用於不同的變數。這意味著對於 a := C{},系統實際上沒有分配記憶體。
以上是為什麼 Go 中具有相同欄位但不同順序的結構體具有不同的大小?的詳細內容。更多資訊請關注PHP中文網其他相關文章!