3 回答

TA貢獻1869條經驗 獲得超4個贊
import unsafe "unsafe"
/* Structure describing an inotify event. */
type INotifyInfo struct {
Wd int32 // Watch descriptor
Mask uint32 // Watch mask
Cookie uint32 // Cookie to synchronize two events
Len uint32 // Length (including NULs) of name
}
func doSomething() {
var info INotifyInfo
const infoSize = unsafe.Sizeof(info)
...
}
注意: OP錯誤。unsafe.Sizeof確實在示例Coord3d結構上返回24。

TA貢獻1780條經驗 獲得超5個贊
羅杰已經展示了如何從不安全的軟件包中使用SizeOf方法。在依賴于該函數返回的值之前,請確保已閱讀以下內容:
該大小不包括x可能引用的任何內存。例如,如果x是一個切片,則Sizeof返回切片描述符的大小,而不是該切片所引用的內存的大小。
除此之外,我想解釋一下如何使用幾個簡單的規則輕松計算任何結構的大小。然后如何使用有用的服務來驗證您的直覺。
大小取決于其組成的類型以及結構中字段的順序(因為將使用不同的填充)。這意味著具有相同字段的兩個結構可以具有不同的大小。
例如,此結構的大小為32
struct {
a bool
b string
c bool
}
并稍作修改,其大小將為24(由于字段的順序更緊湊,因此相差25%)
struct {
a bool
c bool
b string
}
從圖片中可以看到,在第二個示例中,我們刪除了一個填充,并移動了一個字段以利用先前的填充。路線可以是1、2、4或8。填充是用于填充變量以填充路線的空間(基本上是浪費的空間)。
了解此規則并記住以下幾點:
bool,int8 / uint8占用1個字節
int16,uint16-2個字節
int32,uint32,float32-4個字節
int64,uint64,float64,指針-8個字節
字符串-16個字節(2個對齊方式為8個字節)
任何條帶占用24個字節(3個對齊8個字節)。因此
[]bool
,[][][]string
都是一樣的(不要忘記重新閱讀我一開始添加的引文)長度數組
n
需要n
*類型,它需要字節。
有了填充,對齊和字節大小的知識,您可以快速弄清楚如何改善結構(但是使用該服務驗證您的直覺還是有意義的)。

TA貢獻1810條經驗 獲得超5個贊
binary.TotalSize也是一個選項,但請注意,那和unsafe.Sizeof之間的行為略有不同:binary.TotalSize包括切片內容的大小,而unsafe.Sizeof僅返回頂級描述符的大小。這是一個如何使用TotalSize的示例。
package main
import (
"encoding/binary"
"fmt"
"reflect"
)
type T struct {
a uint32
b int8
}
func main() {
var t T
r := reflect.ValueOf(t)
s := binary.TotalSize(r)
fmt.Println(s)
}
- 3 回答
- 0 關注
- 394 瀏覽
添加回答
舉報