变量的内存分配疑问

来源:2-8 如何写出优雅的 Go 代码

feixiang1209

2021-07-08 20:22:37

​package main

import "strings"

type Hello struct {
VeryLongString string
}

func main() {
h := Hello{}
h.VeryLongString = strings.Repeat("hello", 1000000000)
}


如果我有一个结构体里包了一个非常长的字符串,那么在创建h变量的时候,是将结构体的数据保存在了栈中吗,栈帧是有大小的吧,会不会被这个字符串撑爆了?


我通过逃逸分析没有看到这个变量逃逸到堆上。


正常是不是应该在结构体中嵌套指针变量会比较好一点,因为我理解如果嵌套值对象的话 值对象拷贝会非常大?

写回答

1回答

Xargin

2021-07-09

这个应该没分配在栈上:

TEXT main.main(SB) /Users/xargin/lstr.go
lstr.go:9 0x105fd90 65488b0c2530000000 MOVQ GS:0x30, CX
lstr.go:9 0x105fd99 483b6110 CMPQ 0x10(CX), SP
lstr.go:9 0x105fd9d 7640 JBE 0x105fddf
lstr.go:9 0x105fd9f 4883ec30 SUBQ $0x30, SP
lstr.go:9 0x105fda3 48896c2428 MOVQ BP, 0x28(SP)
lstr.go:9 0x105fda8 488d6c2428 LEAQ 0x28(SP), BP
lstr.go:11 0x105fdad 488d0532030200 LEAQ go.string.*+590(SB), AX
lstr.go:11 0x105fdb4 48890424 MOVQ AX, 0(SP)
lstr.go:11 0x105fdb8 48c744240805000000 MOVQ $0x5, 0x8(SP)
lstr.go:11 0x105fdc1 48b80010a5d4e8000000 MOVQ $0xe8d4a51000, AX
lstr.go:11 0x105fdcb 4889442410 MOVQ AX, 0x10(SP)
lstr.go:11 0x105fdd0 e8fbf9ffff CALL strings.Repeat(SB)
lstr.go:12 0x105fdd5 488b6c2428 MOVQ 0x28(SP), BP
lstr.go:12 0x105fdda 4883c430 ADDQ $0x30, SP
lstr.go:12 0x105fdde c3 RET
lstr.go:9 0x105fddf e83c20ffff CALL runtime.morestack_noctxt(SB)
lstr.go:9 0x105fde4 ebaa JMP main.main(SB)


main 函数只分配了 0x30 个字节哦

0

Go高级工程师实战营

慕课网与 GoCN 社区官方联手打造,定义行业Go高级人才培养标准,4个月,快速晋升为P6+/D7级高级人才。

458 学习 · 266 问题

查看课程