GoLang - 内存分配 - []字节VS串

问题描述 投票:2回答:1

在以下代码中:

c := "fool"
d := []byte("fool")
fmt.Printf("c: %T, %d\n", c, unsafe.Sizeof(c)) // 16 bytes
fmt.Printf("d: %T, %d\n", d, unsafe.Sizeof(d)) // 24 bytes

要确定从CloudFoundry接收JSON数据所需的数据类型,我正在测试上面的示例代码,以了解[]bytestring类型的内存分配。


string类型变量c的预期大小是1字节x 4 ascii编码字母= 4字节,但大小显示16字节。

对于byte类型变量d,GO将字符串作为字符串文字嵌入可执行程序中。它使用runtime.stringtoslicebyte函数在运行时将字符串文字转换为字节切片。像... []byte{102, 111, 111, 108}

byte类型变量d的预期大小再次是1字节x 4 ascii值= 4字节但变量d的大小显示24字节,因为它是基础数组容量。


为什么两个变量的大小都不是4个字节?

string go memory size
1个回答
7
投票

Go中的切片和字符串都是类似结构的头文件:

reflect.SliceHeader

type SliceHeader struct {
        Data uintptr
        Len  int
        Cap  int
}

reflect.StringHeader

type StringHeader struct {
        Data uintptr
        Len  int
}

qazxsw poi报告的大小是这些标题的大小,不包括指向数组的大小:

Sizeof采用任何类型的表达式x,并返回假设变量v的大小(以字节为单位),就像通过var v = x声明v一样。大小不包括x可能引用的任何内存。例如,如果x是切片,则Sizeof返回切片描述符的大小,而不是切片引用的内存大小。

要获得某个任意值的实际(“递归”)大小,请使用Go的内置测试和基准测试框架。有关详细信息,请参阅unsafe.Sizeof()

有关字符串的具体信息,请参阅How to get memory size of variable in Golang?String memory usage in Golang值所需的完整内存可以这样计算:

string
© www.soinside.com 2019 - 2024. All rights reserved.