您的当前位置:首页正文

Go语言函数底层实现

2024-11-29 来源:个人技术集锦

基于堆栈模式的程序执行模型决定了函数是语言的一个核心元素。分析Go函数的内部实现,对理解整个程序的执行模型有很大好处。研究底层实现有两个方法一种是看语言编译器源码,分析其对函数的各个特性的处理逻辑,一种是反汇编,将可以执行的程序反汇编出来。

// 开辟栈空间,压找PB保存现场
	SUBQ$x,SP//为函数开辟栈空间
	MOVQBP,y(SP)//保存当前函数BP到y(SP)位置,y为相对SP的偏移量
	LEAQy(SP),BP//重置BP,使其指向刚刚保存BP旧值的位置,这里主要是方便后续BP的恢复
//弹出栈,恢复BP
	MOVQy(SP),BP//恢复BP的值为调用前的值
	ADDQ$x,SP//恢复SP的值为函数开始时的值

函数调用

  • 函数的调用者负责准备环境,包括为参数和返回值开辟栈空间
  • 寄存器的保存和恢复也由调用方负责。
  • 函数调用后回收栈空间,恢复BP也由主函数负责
    函数的多值返回实质上是在栈上开辟出多个地址分别存放返回值,这个并没有什么特别的地方,如果返回值是放在堆上边的则多了一个复制的工作。
    函数在调用前其实就已经给参数和返回值分配了存储空间,分配顺序是从右向左的。先是返回值然后是参数
显示全文