1 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊
結(jié)構(gòu)體有固定的大小。如何初始化它們并不重要,它需要相同數(shù)量的內(nèi)存。
如果不為使用零值初始化的字段分配內(nèi)存,則稍后分配值將需要分配內(nèi)存。
這是一個(gè)簡(jiǎn)單的基準(zhǔn)代碼來(lái)驗(yàn)證它:
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},
}
}
}
使用 運(yùn)行它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()都執(zhí)行 128 字節(jié)的單個(gè)分配,這是(返回 128)BenchmarkNonZero()的大小。此大小基于 64 位架構(gòu):8 ( ) + 16(標(biāo)頭)+ 24(切片標(biāo)頭)+ 80(數(shù)組大?。?。對(duì)于此結(jié)構(gòu),不需要隱式填充,因此這是其最終大小。Tunsafe.Sizeof(T{})intstring[10]int64
在提供值時(shí),我有目的地使用xval包級(jí)變量,T.x以避免必須在基準(zhǔn)測(cè)試中為其分配值(并且不要弄亂基準(zhǔn)測(cè)試的內(nèi)容)。
- 1 回答
- 0 關(guān)注
- 139 瀏覽
添加回答
舉報(bào)