Go中的sizeof结构

我正在看Go,它看起来很有前途。我试图弄清楚如何获得go结构的大小,例如

type Coord3d struct {
    X, Y, Z int64
 }

我当然知道它是24字节,但是我想以编程方式知道它。

您对如何执行此操作有任何想法吗?


波斯汪
浏览 345回答 3
3回答

MMTTMM

import unsafe "unsafe"/* Structure describing an inotify event.  */type INotifyInfo struct {    Wd     int32  // Watch descriptor    Mask   uint32 // Watch mask    Cookie uint32 // Cookie to synchronize two events    Len    uint32 // Length (including NULs) of name}func doSomething() {    var info INotifyInfo    const infoSize = unsafe.Sizeof(info)    ...}注意: OP错误。unsafe.Sizeof确实在示例Coord3d结构上返回24。

翻阅古今

罗杰已经展示了如何从不安全的软件包中使用SizeOf方法。在依赖于该函数返回的值之前,请确保已阅读以下内容:该大小不包括x可能引用的任何内存。例如,如果x是一个切片,则Sizeof返回切片描述符的大小,而不是该切片所引用的内存的大小。除此之外,我想解释一下如何使用几个简单的规则轻松计算任何结构的大小。然后如何使用有用的服务来验证您的直觉。大小取决于其组成的类型以及结构中字段的顺序(因为将使用不同的填充)。这意味着具有相同字段的两个结构可以具有不同的大小。例如,此结构的大小为32struct {    a bool    b string    c bool}并稍作修改,其大小将为24(由于字段的顺序更紧凑,因此相差25%)struct {    a bool    c bool    b string}从图片中可以看到,在第二个示例中,我们删除了一个填充,并移动了一个字段以利用先前的填充。路线可以是1、2、4或8。填充是用于填充变量以填充路线的空间(基本上是浪费的空间)。了解此规则并记住以下几点:bool,int8 / uint8占用1个字节int16,uint16-2个字节int32,uint32,float32-4个字节int64,uint64,float64,指针-8个字节字符串-16个字节(2个对齐方式为8个字节)任何条带占用24个字节(3个对齐8个字节)。因此[]bool,[][][]string都是一样的(不要忘记重新阅读我一开始添加的引文)长度数组n需要n*类型,它需要字节。有了填充,对齐和字节大小的知识,您可以快速弄清楚如何改善结构(但是使用该服务验证您的直觉还是有意义的)。

森栏

binary.TotalSize也是一个选项,但请注意,那和unsafe.Sizeof之间的行为略有不同:binary.TotalSize包括切片内容的大小,而unsafe.Sizeof仅返回顶级描述符的大小。这是一个如何使用TotalSize的示例。package mainimport (    "encoding/binary"    "fmt"    "reflect")type T struct {    a uint32    b int8}func main() {    var t T    r := reflect.ValueOf(t)    s := binary.TotalSize(r)    fmt.Println(s)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go