首頁 >後端開發 >Golang >為什麼 Go 中具有相同欄位但不同順序的結構體具有不同的大小?

為什麼 Go 中具有相同欄位但不同順序的結構體具有不同的大小?

Linda Hamilton
Linda Hamilton原創
2024-12-26 03:29:08368瀏覽

Why Do Structs with Identical Fields but Different Orders Have Different Sizes in Go?

具有不同欄位順序的不同結構體大小

在提供的程式碼中,兩個結構體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中文網其他相關文章!

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