在Golang里面字符串的实现是一个struct,大概就是这样的定义
type GoString struct {
value string
len int
}
所以Go的字符串占用了16个字节来描述,我想这样做的原因是使得len(str)的操作可以始终保持的O(1)的时间复杂度得到。
今天使用GDB来调试直观的感受下字符串的内存存储,测试代码如下
package main
import (
"fmt"
"unsafe"
)
func main() {
s := "hello,world"
p := &s
fmt.Println(s, p, unsafe.Sizeof(s))
fmt.Println("break")
}
Makefile如下
all:
@go build -gcflags "-N -l" hello.go
@gdb ./hello
载入GDB之后,我们在fmt.Println(“break”)那一行下断,得到s的内存地址
,我这里得到的地址是0xc82006aba0
然后查看地址的内容,使用x/20x 0xc82006aba0命令
字符串一共16个字节,前8个字节是字符串实际保持内容的内存地址,后8个字节是字符串的长度。
我这里可以看到字符串地址是0x00000000007052f0,字符串长度是0x000000000000000b(“hello,world”这个字符串的长度刚好是11个字节,也就是0x0b),最后我们查看0x00000000007052f0处的内容,查看字符串实际存储,使用命令x/20x 0x00000000007052f0
我这里得到的是0x7052f0: 0x6f772c6f6c6c6568 0x0000000000646c72
我的CPU是Intel的,所以小端模式(低地址放低位,高地址放高位), 字符串”hello,world”中h被分配在最低的地址,所以对应到0x68,类推。
评论
暂无评论~~