局部变量和函数参数为什么要放在栈中

局部变量和函数参数为什么要放在栈中

局部变量,顾名思义其作用域属于局部。全局的变量,意味着谁都随时随地可以访问,所以其放在数据段中。而局部变量只是自己在用,放在数据段中纯属浪费空间,没有必要,故将其放在自己的栈中,随时可以清理,真正体现了局部的意义。

这个就是堆栈框架,栈由于是向下生长的,堆栈框架就是把esp指针提前加一个数,原esp指针到新esp指针之间的栈空间用来存储局部变量。解释一个概念,堆是程序运行过程中用于动态内存分配的内存空间,是操作系统为每个用户进程规划的,属于软件范畴。栈是处理器运行必备的内存空间,是硬件必需的,但又是由操作系统提供的。

堆是堆,而堆栈就是栈,和堆没关系,只是都这么叫。栈和堆栈都是指的栈,在C程序的内存布局中,由于堆和栈的地址空间是接壤的,栈是从高地址往低地址发展,堆是从低地址往高地址发展,堆和栈早晚会碰头,它们各自的大小取决于实际的使用情况,界限并不明朗,所以这可能是堆栈常放在一起称呼的原因吧。

函数参数为什么放在栈区呢?第一也是其局限性导致,只有这个函数用这个参数,何必将其放在数据段呢?二是因为函数是在程序执行过程中调用的,属于动态的调用,编译时无法预测何时调用及被调用的次数,函数的参数及返回值都需要内存来存储,如果是递归调用的话,参数及返回值需要的内存空间也就不确定了,这取决于递归的次数。有些体系结构的计算机也把函数参数放到寄存器里面去。

总之,在函数的编译阶段根本无法确定他会被调用几次,其参数和函数的返回地址也要内存来存储,所以也不知道其会需要多少内存。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 10,228评论 1 19
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 12,385评论 0 27
  • 文章也同时在个人博客 http://kimihe.com/更新 引言 网络上关于内存中各区段作用的文章有很多,但不...
    QihuaZhou阅读 38,188评论 12 135
  • 有个朋友曾跟我说,她要贫穷而美丽。 现在莫名想到这句话,我想我只做到了一半, 大概是,美丽。
    衾骨阅读 3,579评论 0 0
  • 再见! 哦,随便发发开玩笑的。
    森麻鬼阅读 975评论 0 0