美文网首页
go中unsafe.Sizeof的使用

go中unsafe.Sizeof的使用

作者: PENG先森_晓宇 | 来源:发表于2020-12-30 11:02 被阅读0次

unsafe.Sizeof用于查看变量在内存中占用的字节大小。

int

var a = int 1
fmt.Println(unsafe.Sizeof(a))//8

int类型(64位)默认为8个字节。

bool

var a = bool false
fmt.Println(unsafe.Sizeof(a))//1

bool类型默认为1个字节。

byte

var a = byte 1
fmt.Println(unsafe.Sizeof(a))//1

byte类型默认为1个字节。

切片

slice := []int{1,2,3}
fmt.Println(unsafe.Sizeof(slice)) //24

上面声明了一个切片,然后打印出sizeof的值为24,但是不管slice里的元素为多少,sizeof返回的数据都是24。

然后在官方文档上找到一句话

Sizeof takes an expression x of any type and returns the size in bytes of a hypothetical variable v as if v was declared via var v = x. The size does not include any memory possibly referenced by x. For instance, if x is a slice, Sizeof returns the size of the slice descriptor, not the size of the memory referenced by the slice.

最后一句

if x is a slice, Sizeof returns the size of the slice descriptor, not the size of the memory referenced by the slice.

如果x为一个切片,sizeof返回的大小是切片的描述符,而不是切片所指向的内存的大小。

数组

那么这里如果换成一个数组呢?而不是一个切片

arr := [...]int{1,2,3,4,5}
fmt.Println(unsafe.Sizeof(arr)) //40
arr2 := [...]int{1,2,3,4,5,6}
fmt.Println(unsafe.Sizeof(arr)) //48

可以看到sizeof(arr)的值是在随着arr的元素的个数的增加而增加,int类型(64位)的数组每个元素占用8个字节,5个元素意味占用40个字节,6个元素意味占用48个字节。

字符串

str := "hello"
fmt.Println(unsafe.Sizeof(str)) //16

不论字符串的len有多大,sizeof始终返回16,这是为啥,字符串不是也是不可变的吗?实际上字符串类型对应一个结构体,该结构体有两个域,第一个域是指向该字符串的指针,第二个域是字符串的长度,每个域占8个字节,但是并不包含指针指向的字符串的内容,这也就是为什么sizeof始终返回的是16

相关文章

  • go中unsafe.Sizeof的使用

    unsafe.Sizeof用于查看变量在内存中占用的字节大小。 int int类型(64位)默认为8个字节。 bo...

  • go中...的使用

    数组中... 表示不显式指定数组大小,数组大小由其中的元素数目决定。如打印 的结果为 打散作为切片(slice) ...

  • Go实战--golang中使用redis

    生命不止,继续 go go go !!! 以前介绍过golang中如何使用sqlite3: 《Go实战–go语言操...

  • golang-event在以太坊中的使用

    go-ethereum中go-event库的使用 github.com/ethereum/go-ethereum/...

  • Go语言操作Redis

    Go语言操作Redis 在项目开发中redis的使用也比较频繁,本文介绍了Go语言中go-redis库的基本使用。...

  • 10 结构体struct

    Go 中的struct与C中的struct非常相似,并且Go没有class使用 type struc...

  • go使用redis

    在go中可以使用github.com/go-redis/redis[https://github.com/go-r...

  • Go中cookie的使用

    HTTP是无状态的协议,就是说通常情况下,HTTP每次请求都是独立的,服务器几乎没有什么信息可以判断请求是哪个用户...

  • go 中的redis使用

  • 十.Go结构struct

    结构struct Go中的struct与C中的struct相似,并且go没有class 使用type 结构名称 s...

网友评论

      本文标题:go中unsafe.Sizeof的使用

      本文链接:https://www.haomeiwen.com/subject/zrocoktx.html