如何在golang中获得结构体的大小及其内容的字节

  • 本文关键字:字节 结构体 golang memory go
  • 更新时间 :
  • 英文 :


我有一个结构体,比如:

type ASDF struct {
    A   uint64
    B   uint64
    C   uint64
    D   uint64
    E   uint64
    F   string
}

我创建了一个struct的slice: a := []ASDF{}

我对结构体的切片进行操作(添加/删除/更新内容不同的结构体);如何以字节(内存)为单位获得片及其内容的总大小 ?是否有一个内置的做到这一点,或者我需要手动运行计算使用unsafe.Sizeof,然后len每个字符串?

将所有内存的大小相加,不包括垃圾收集器和其他开销。例如,

package main
import (
    "fmt"
    "unsafe"
)
type ASDF struct {
    A uint64
    B uint64
    C uint64
    D uint64
    E uint64
    F string
}
func (s *ASDF) size() int {
    size := int(unsafe.Sizeof(*s))
    size += len(s.F)
    return size
}
func sizeASDF(s []ASDF) int {
    size := 0
    s = s[:cap(s)]
    size += cap(s) * int(unsafe.Sizeof(s))
    for i := range s {
        size += (&s[i]).size()
    }
    return size
}
func main() {
    a := []ASDF{}
    b := ASDF{}
    b.A = 1
    b.B = 2
    b.C = 3
    b.D = 4
    b.E = 5
    b.F = "ASrtertetetetetetetDF"
    fmt.Println((&b).size())
    a = append(a, b)
    c := ASDF{}
    c.A = 10
    c.B = 20
    c.C = 30
    c.D = 40
    c.E = 50
    c.F = "ASetDF"
    fmt.Println((&c).size())
    a = append(a, c)
    fmt.Println(len(a))
    fmt.Println(cap(a))
    fmt.Println(sizeASDF(a))
}
输出:

69
54
2
2
147
http://play.golang.org/p/5z30vkyuNM

如果你想获得任何结果,我恐怕要说unsafe.Sizeof是这里的路。您不应该依赖结构的内存大小。请注意,即使unsafe.Sizeof的结果也是不准确的:运行时可能会向您无法观察到的数据添加头,以帮助进行垃圾收集。

对于您的特定示例(查找缓存大小),我建议您使用对许多处理器都明智的静态大小。在几乎所有的情况下,做这样的微优化是不会得到回报的。

最新更新