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 关注
- 88 浏览
添加回答
举报