Memory 如何在golang中获取结构的大小及其内容(以字节为单位)?
我有一个结构,比如:Memory 如何在golang中获取结构的大小及其内容(以字节为单位)?,memory,go,Memory,Go,我有一个结构,比如: type ASDF struct { A uint64 B uint64 C uint64 D uint64 E uint64 F string } 我创建了该结构的一个切片:a:=[]ASDF{} 我对结构的该部分执行操作(添加/删除/更新内容不同的结构);如何获取片及其内容的总大小(以字节为单位)(对于内存)?是否有内置的方法来执行此操作,或者我是否需要使用unsafe.Sizeof手动运行计算,
type ASDF struct {
A uint64
B uint64
C uint64
D uint64
E uint64
F string
}
我创建了该结构的一个切片:a:=[]ASDF{}
我对结构的该部分执行操作(添加/删除/更新内容不同的结构);如何获取片及其内容的总大小(以字节为单位)(对于内存)?是否有内置的方法来执行此操作,或者我是否需要使用
unsafe.Sizeof
手动运行计算,然后使用len
每个字符串?我恐怕要说不安全。如果您想得到任何结果,Sizeof
是一种方法。一个结构的内存大小是你不应该依赖的。请注意,即使是unsafe.Sizeof
的结果也不准确:运行时可能会向数据中添加您无法观察到的头,以帮助进行垃圾收集
对于您的特定示例(查找缓存大小),我建议您使用对许多处理器都适用的静态大小。在几乎所有情况下,进行这样的微优化都不会有回报。将所有内存的大小相加,不包括垃圾收集器和其他开销。比如说,
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
该函数似乎只适用于数组、字符串、切片和通道。对于structs=(@maerics只是为了更好地理解您想要实现的目标,您认为这些信息有什么用处?@fuzzxl:不知道,问OP=)我只是从Peanon galleryQuick问题中发表评论,struct
ASDF
既然声明了所有变量类型,那么大小不是固定的吗?然后您可以将ASDF
的结构指针的大小乘以len(a)
?因为您只能将相同大小的元素附加到切片中?还是我误解了切片的工作原理?不过string
字段会有问题。