结构体中的空字段会消耗内存吗?

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


type Measure struct {

    ID            int

    IndexName     string    

    IndexValue    int   

    Redistributed float64

    MyArray       []myObject

}

如果我用以下方式初始化我的对象


measure := Measure{

   ID: 10,

   IndexName: "",

   IndexName: 0,

   Redistributed: 0

   MyArray: nil         

}

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


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


慕少森
浏览 101回答 1
1回答

烙印99

结构体有固定的大小。如何初始化它们并不重要,它需要相同数量的内存。如果不为使用零值初始化的字段分配内存,则稍后分配值将需要分配内存。这是一个简单的基准代码来验证它:type T struct {&nbsp; &nbsp; i int&nbsp; &nbsp; s string&nbsp; &nbsp; x []int&nbsp; &nbsp; a [10]int64}var x *Tfunc BenchmarkZero(b *testing.B) {&nbsp; &nbsp; for i := 0; i < b.N; i++ {&nbsp; &nbsp; &nbsp; &nbsp; x = &T{}&nbsp; &nbsp; }}var xval = make([]int, 10)func BenchmarkNonZero(b *testing.B) {&nbsp; &nbsp; for i := 0; i < b.N; i++ {&nbsp; &nbsp; &nbsp; &nbsp; x = &T{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i: 10,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; s: "gopher",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x: xval,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a: [10]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}使用 运行它go test -bench. -benchmem,输出是:BenchmarkZero-4&nbsp; &nbsp; &nbsp; 16268067&nbsp; &nbsp; &nbsp; 69.6 ns/op&nbsp; &nbsp; 128 B/op&nbsp; &nbsp; allocs/opBenchmarkNonZero-4&nbsp; &nbsp;13961296&nbsp; &nbsp; &nbsp; 75.8 ns/op&nbsp; &nbsp; 128 B/op&nbsp; &nbsp; allocs/op和BenchmarkZero()都执行 128 字节的单个分配,这是(返回 128)BenchmarkNonZero()的大小。此大小基于 64 位架构:8 ( ) + 16(标头)+ 24(切片标头)+ 80(数组大小)。对于此结构,不需要隐式填充,因此这是其最终大小。Tunsafe.Sizeof(T{})intstring[10]int64在提供值时,我有目的地使用xval包级变量,T.x以避免必须在基准测试中为其分配值(并且不要弄乱基准测试的内容)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go