Skip to content

Commit bec03ad

Browse files
committed
feat: add go/golang_bootstrap.md
1 parent 2f5a1b7 commit bec03ad

File tree

7 files changed

+1740
-12
lines changed

7 files changed

+1740
-12
lines changed

SUMMARY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,4 @@
3737
* [pid cgroup](cgroup/pid_cgroup.md)
3838
* [go](go/README.md)
3939
* [golang 中函数使用值返回与指针返回的区别,底层原理分析](go/func_return_value_or_pointer.md)
40+
* [Golang 程序启动流程分析](go/golang_bootstrap.md)

go/func_return_value_or_pointer.html

Lines changed: 41 additions & 4 deletions
Large diffs are not rendered by default.

go/func_return_value_or_pointer.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,10 @@ Go 程序会在两个地方为变量分配内存,一个是全局的堆上,
3535
函数调用栈简称栈,在程序运行过程中,不管是函数的执行还是函数调用,栈都起着非常重要的作用,它主要被用来:
3636

3737
- 保存函数的局部变量;
38-
- 向被调用函数传递参数
38+
- 向被调用函数传递的参数
3939
- 返回函数的返回值;
4040
- 保存函数的返回地址,返回地址是指从被调用函数返回后调用者应该继续执行的指令地址;
41+
- 寄存器的初始值;
4142

4243
每个函数在执行过程中都需要使用一块栈内存用来保存上述这些值,我们称这块栈内存为某函数的栈帧(stack frame)。当发生函数调用时,因为调用者还没有执行完,其栈内存中保存的数据还有用,所以被调用函数不能覆盖调用者的栈帧,只能把被调用函数的栈帧“push”到栈上,等被调函数执行完成后再把其栈帧从栈上“pop”出去,这样,栈的大小就会随函数调用层级的增加而生长,随函数的返回而缩小,也就是说函数调用层级越深,消耗的栈空间就越大。栈的生长和收缩都是自动的,由编译器插入的代码自动完成,因此位于栈内存中的函数局部变量所使用的内存随函数的调用而分配,随函数的返回而自动释放,所以程序员不管是使用有垃圾回收还是没有垃圾回收的高级编程语言都不需要自己释放局部变量所使用的内存,这一点与堆上分配的内存截然不同。
4344

0 commit comments

Comments
 (0)