我有一个带有字段的结构:
type Measure struct {
ID int
IndexName string
IndexValue int
Redistributed float64
MyArray []myObject
}
Run Code Online (Sandbox Code Playgroud)
如果我用
measure := Measure{
ID: 10,
IndexName: "",
IndexName: 0,
Redistributed: 0
MyArray: nil
}
Run Code Online (Sandbox Code Playgroud)
我的内存占用应该是多少?当我用空字段实例化一个结构体时,我是否仍然使用内存?
我很确定我是,但我只需要确认。
结构具有固定的大小。您如何初始化它们并不重要,它需要相同数量的内存。
如果不会为初始化为零值的字段分配内存,则稍后分配值将需要分配内存。
这是一个简单的基准代码来验证它:
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},
}
}
}
Run Code Online (Sandbox Code Playgroud)
运行它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
Run Code Online (Sandbox Code Playgroud)
二者BenchmarkZero()并BenchmarkNonZero()执行一个分配有128个字节,这是的大小T(unsafe.Sizeof(T{})返回128)。这个大小是在 64 位架构上的:8 ( int) + 16 ( stringheader) + 24 (slice header) + 80 ( [10]int64array size)。在这种结构的情况下不需要隐式填充,所以这是它的最终大小。
我xval在提供值时故意使用包级别变量,T.x以避免必须在基准测试中为其分配值(并且不要与基准测试混淆)。