- Published on
V8相关(五)
- Authors
- Name
- Et cetera
V8 为什么使用栈结构来管理函数调用?
- 大部分高级语言都不约而同地采用栈这种结构来管理函数调用为什么呢?这与函数的特性有关.通常函数有两个主要的特性:
函数可以被调用
你可以在一个函数中调用另外一个函数当函数调用发生时执行代码的控制权将从父函数转移到子函数子函数执行结束之后又会将代码执行控制权返还给父函数函数具有作用域机制
所谓作用域机制是指函数在执行的时候可以将定义在函数内部的变量和外部环境隔离在函数内部定义的变量我们也称为临时变量临时变量只能在该函数中被访问外部函数通常无权访问当函数执行结束之后存放在内存中的临时变量也随之被销毁- 总结:
函数调用者的生命周期总是长于被调用者(后进)并且被调用者的生命周期总是先于调用者的生命周期结束 (先出)
因为函数是有作用域机制的作用域机制通常表现在函数执行时会在内存中分配函数内部的变量、上下文等数据在函数执行完成之后这些内部数据会被销毁掉.所以站在函数资源分配和回收角度来看被调用函数的资源分配总是晚于调用函数 (后进)而函数资源的释放则总是先于调用函数 (先出)
通过观察函数的生命周期
和函数的资源分配情况
我们发现它们都符合后进先出 (LIFO)
的策略而栈结构正好满足这种后进先出 (LIFO)
的需求所以我们选择栈来管理函数调用关系是一种很自然的选择
栈如何管理函数调用?
函数在执行过程中,其内部的临时变量会按照执行顺序被压入到栈中
既然有了栈,为什么还要堆?
使用栈的好处:
- 栈的结构和非常适合函数调用过程
- 在栈上分配资源和销毁资源的速度非常快,这主要归结于栈空间是连续的,分配空间和销毁空间只需要移动下指针就可以了
但是因为栈的内存是连续的,所以很难在内存中分配一块连续的大空间,所以栈空间十分有限;而堆结构
因为本质是一颗树结构,所以并不需要连续内存,从而可以分配大内存