结构中的空字段是否消耗内存?

Jul*_*oro -1 memory struct go

我有一个带有字段的结构:

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)

我的内存占用应该是多少?当我用空字段实例化一个结构体时,我是否仍然使用内存?

我很确定我是,但我只需要确认。

icz*_*cza 6

结构具有固定的大小。您如何初始化它们并不重要,它需要相同数量的内存。

如果不会为初始化为零值的字段分配内存,则稍后分配值将需要分配内存。

这是一个简单的基准代码来验证它:

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个字节,这是的大小Tunsafe.Sizeof(T{})返回128)。这个大小是在 64 位架构上的:8 ( int) + 16 ( stringheader) + 24 (slice header) + 80 ( [10]int64array size)。在这种结构的情况下不需要隐式填充,所以这是它的最终大小。

xval在提供值时故意使用包级别变量,T.x以避免必须在基准测试中为其分配值(并且不要与基准测试混淆)。