【问题标题】:Does Javascript call stack live in Heap?Javascript调用堆栈是否存在于堆中?
【发布时间】:2021-06-28 12:03:00
【问题描述】:

一切都是javascript中的对象。 这是否意味着调用堆栈与内存的堆栈部分无关,而函数调用只是堆叠在堆部分中?

【问题讨论】:

    标签: javascript stack heap-memory


    【解决方案1】:

    javascript 中的一切都是对象

    这不是真的。基元是基元,除非您将它们用作对象。一个数字可能存储为例如JavaScript 引擎提供的 32 位整数或 64 位浮点数。

    在调用堆栈的上下文中更重要的是变量可以保存不同类型的值,因此一个变量可能保存不同大小的不同值。因此,一个非常幼稚的实现可以将指针分配到堆栈上,然后这些指针将指向不同大小的对象(或包装在某个容器中的原语)。

    现在引擎通常不幼稚,它们可以很容易地假设某些变量在某个时间持有某些变量类型,然后他们可以直接将固定大小的数据结构分配到堆栈上。

    函数调用只是堆叠在堆部分?

    函数变量在内存中表示为堆栈的原因是函数可能会递归调用自身,因此对于一个函数可以存在多个值。堆栈是一个不错的选择,因为变量的地址可以很容易地从堆栈指针中计算出来(一个加法):

     function fn() {
       var a = 1, b = 2;
       fn();
     }
    
    // how the stack of might look like (very simplified)
    //                           v stackpointer
    adress | 0 | 1 | 2 | 3 | 4 | 5
    value  | 1 | 2 | 1 | 2 | 1 | 2
    
    // some pseudo Cish code
    void* stackpointer = 5;
    int currentB = (stackpointer)*
    int currentA = (stackpointer - 1)*
    

    但是,如果变量的大小是已知的,这只是那么容易。堆栈在内存中的分配位置并不重要,只是所有值都是固定大小的。

    也没有“堆栈”,如果您调用异步函数,它们的执行可能会暂停,并且对于每个暂停的函数,某种形式的调用堆栈必须保留在内存中。所以总是有一个堆栈当前正在执行,最终有多个堆栈被暂停。有人可能会说当前正在执行的堆栈是“堆栈”,而其他堆栈是“在堆中”,尽管这种区别不是很有用,特别是因为可能还有多个堆(例如,一个用于字符串的堆,一个堆对于对象,...)。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-06
    • 2016-10-11
    • 2014-10-04
    • 2017-01-17
    • 2012-06-26
    • 2012-05-01
    • 2016-06-26
    • 2018-04-21
    相关资源
    最近更新 更多