golang底层 其他

动态栈

栈是自动增长的,默认2KB,32位架构最大250M,64位架构最大1G,可用runtime/debug.SetMaxStack来设置

每次执行函数调用时Go的runtime都会进行检测,若当前栈的大小不够用,则会触发“中断”,从当前函数进入到Go的运行时库,Go的运行时库会保存此时的函数上下文环境,然后分配一个新的足够大的栈空间,将旧栈的内容拷贝到新栈中,并做一些设置,使得当函数恢复运行时,函数会在新分配的栈中继续执行,仿佛整个过程都没发生过一样,这个函数会觉得自己使用的是一块大小“无限”的栈空间。

逃逸

func f(){

  p := Point{1,2}

  return &p

}

编译器会通过逃逸分析技术,分析出p的作用范围,p会从栈中逃逸,被分配到堆上

闭包

闭包是函数和它所引用的环境,返回闭包时不是返回函数,而是返回结构体,结构体中包含函数和引用的环境中的变量地址

猜你喜欢

转载自www.cnblogs.com/ts65214/p/12976989.html