开发者社区> 问答> 正文

为什么叫做栈内存?是此内存机制使用了栈的原理吗?

274
这是百科的解释,java可以换成任何编程语言 :C/PHP/Python
就好像我们在页面最顶部设置了一个变量
screenshot
难道$a = 1是到最后才输出的吗?
怎么回事呢?是我理解有误吗?
问题:为什么叫做栈内存?难道此内存机制使用了栈的原理?

展开
收起
杨冬芳 2016-05-27 16:58:29 2305 0
1 条回答
写回答
取消 提交回答
  • IT从业

    栈内存一般存储的是函数的调用信息和函数中申明的变量,因为函数的调用是递归的,外层函数一定比内层被调用的函数先加载和执行,而一定等到内层被调用函数结束后才能结束,这个先进后出的机制就是为什么叫栈内存的原因。
    PS:在编译时编译器会先收集此函数中所有定义的变量,将他们放在函数最前面申请内存,所以他们进出栈的顺序不是你在编写程序时定义的顺序,而是在函数执行前进栈,函数执行完成后出栈。

    举个实际的例子吧:
    假设某个调用过程是这样的

    void a() {
        int p = 1;
        int q = 2;
    }
    
    void b() {
        int x = 3;
        int y = 4;
        
        a();
        
        int z = 5;
    }

    那么我们在调用b();的过程中栈内存其实经历了一下变化:
    ([a]、[b]代表a()和b()的基本信息,如程序指针等)

    进入b函数时
    栈底 < 栈顶 (函数信息空间进栈)
    [b]
    其他操作无关进出栈,略去

    进入a函数时 (函数信息空间进栈)
    `栈底 < 栈顶
    [b] < x < y < z < [a]`

    为a函数内参数申请空间
    `栈底 < 栈顶 (参数空间进栈)
    [b] < x < y < z < [a] < p < q`

    完成a函数时 (参数空间出栈)
    `栈底 < 栈顶
    [b] < x < y < z < [a]`

    退出a函数时 (函数信息空间出栈)
    `栈底 < 栈顶
    [b] < x < y < z`

    完成b函数时 (参数空间出栈)
    `栈底 < 栈顶
    [b]`

    退出b函数时 (函数信息空间出栈)
    栈底 < 栈顶

    2019-07-17 19:18:18
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
内存取证与IaaS云平台恶意行 为的安全监控 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载
低代码开发师(初级)实战教程 立即下载