3 回答
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。
TA贡献1780条经验 获得超5个赞
罗杰已经展示了如何从不安全的软件包中使用SizeOf方法。在依赖于该函数返回的值之前,请确保已阅读以下内容:
该大小不包括x可能引用的任何内存。例如,如果x是一个切片,则Sizeof返回切片描述符的大小,而不是该切片所引用的内存的大小。
除此之外,我想解释一下如何使用几个简单的规则轻松计算任何结构的大小。然后如何使用有用的服务来验证您的直觉。
大小取决于其组成的类型以及结构中字段的顺序(因为将使用不同的填充)。这意味着具有相同字段的两个结构可以具有不同的大小。
例如,此结构的大小为32
struct {
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
*类型,它需要字节。
有了填充,对齐和字节大小的知识,您可以快速弄清楚如何改善结构(但是使用该服务验证您的直觉还是有意义的)。
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)
}
- 3 回答
- 0 关注
- 343 浏览
添加回答
举报