为了账号安全,请及时绑定邮箱和手机立即绑定

Go中的sizeof结构

Go中的sizeof结构

Go
波斯汪 2021-04-08 14:11:26
我正在看Go,它看起来很有前途。我试图弄清楚如何获得go结构的大小,例如type Coord3d struct {     X, Y, Z int64  }我当然知道它是24字节,但是我想以编程方式知道它。您对如何执行此操作有任何想法吗?
查看完整描述

3 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

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。

查看完整回答
反对 回复 2021-04-26
?
翻阅古今

TA贡献1780条经验 获得超5个赞

罗杰已经展示了如何从不安全的软件包中使用SizeOf方法。在依赖于该函数返回的值之前,请确保已阅读以下内容:


该大小不包括x可能引用的任何内存。例如,如果x是一个切片,则Sizeof返回切片描述符的大小,而不是该切片所引用的内存的大小。


除此之外,我想解释一下如何使用几个简单的规则轻松计算任何结构的大小。然后如何使用有用的服务来验证您的直觉。


大小取决于其组成的类型以及结构中字段的顺序(因为将使用不同的填充)。这意味着具有相同字段的两个结构可以具有不同的大小。


例如,此结构的大小为32


struct {

    a bool

    b string

    c bool

}

并稍作修改,其大小将为24(由于字段的顺序更紧凑,因此相差25%)


struct {

    a bool

    c bool

    b string

}

//img1.sycdn.imooc.com//60866e2400016fbe03180208.jpg//img1.sycdn.imooc.com//60866e2c000134d103150177.jpg

从图片中可以看到,在第二个示例中,我们删除了一个填充,并移动了一个字段以利用先前的填充。路线可以是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*类型,它需要字节。


有了填充,对齐和字节大小的知识,您可以快速弄清楚如何改善结构(但是使用该服务验证您的直觉还是有意义)。


查看完整回答
反对 回复 2021-04-26
?
森栏

TA贡献1810条经验 获得超5个赞

binary.TotalSize也是一个选项,但请注意,那和unsafe.Sizeof之间的行为略有不同:binary.TotalSize包括切片内容的大小,而unsafe.Sizeof仅返回顶级描述符的大小。这是一个如何使用TotalSize的示例。


package main


import (

    "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)

}


查看完整回答
反对 回复 2021-04-26
  • 3 回答
  • 0 关注
  • 343 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信