我有一个结构体,比如:
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
的结果也是不准确的:运行时可能会向您无法观察到的数据添加头,以帮助进行垃圾收集。
对于您的特定示例(查找缓存大小),我建议您使用对许多处理器都明智的静态大小。在几乎所有的情况下,做这样的微优化是不会得到回报的。