1 回答

TA貢獻1829條經驗 獲得超13個贊
結構體有固定的大小。如何初始化它們并不重要,它需要相同數量的內存。
如果不為使用零值初始化的字段分配內存,則稍后分配值將需要分配內存。
這是一個簡單的基準代碼來驗證它:
type T struct {
i int
s string
x []int
a [10]int64
}
var x *T
func BenchmarkZero(b *testing.B) {
for i := 0; i < b.N; i++ {
x = &T{}
}
}
var xval = make([]int, 10)
func BenchmarkNonZero(b *testing.B) {
for i := 0; i < b.N; i++ {
x = &T{
i: 10,
s: "gopher",
x: xval,
a: [10]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
}
}
}
使用 運行它go test -bench. -benchmem,輸出是:
BenchmarkZero-4 16268067 69.6 ns/op 128 B/op allocs/op
BenchmarkNonZero-4 13961296 75.8 ns/op 128 B/op allocs/op
和BenchmarkZero()都執行 128 字節的單個分配,這是(返回 128)BenchmarkNonZero()的大小。此大小基于 64 位架構:8 ( ) + 16(標頭)+ 24(切片標頭)+ 80(數組大?。?。對于此結構,不需要隱式填充,因此這是其最終大小。Tunsafe.Sizeof(T{})intstring[10]int64
在提供值時,我有目的地使用xval包級變量,T.x以避免必須在基準測試中為其分配值(并且不要弄亂基準測試的內容)。
- 1 回答
- 0 關注
- 135 瀏覽
添加回答
舉報