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
字段会有问题。