【答疑释惑】C语言里面栈和堆的区别

很多初学者朋友对C语言里面的堆和栈理解的不是太清楚,模模糊糊。他们到底有哪些区别呢?我认为主要从以下几根方面来了解他们的不同之处:

1,变量位置:栈和堆都是程序在被加载器加载到内存后留出的一段空间,他们所在的地址不同,也不可能重叠。

2,增长方向:栈从高地址向低地址增长,也就是说栈空间使用越多,地址越小。堆空间从低地址向高地址增加,所以在不考虑中间有其他地址释放的情况下,后分配的对空间地址会比前面分配的大。

3,分配方式:栈空间通过栈指针移动自动实现,我们在写程序时并不关心这个问题。堆空间一般通过malloc/free或者new/delete来实现,这个过程需要我们显性管理。

4,存活时间:栈空间里面的变量存活时间取决于函数栈帧,当函数调用完返回,控制栈帧的ESP指针会自动恢复函数调用前的状态,达到栈平衡,栈帧自然消失,该栈中变量单元也处于不受管理状态,但在没有被其他函数作为栈使用之前,一般不会改变,所以有时候函数内的变量在外面还能正确访问到,但是已经不可靠。堆空间的存活时间存在于malloc/new和free/delete之间,但如果一直不free/delete,则会一直存在知道进程结束。

5,使用效率:堆空间由于只需要栈指针移动,在汇编层面上只要一条指令即可,速度快的多。而堆内存的分配需要经过复杂的查询、异步保护,时间相对慢很多。

6,泄露情况:栈空间由编译器控制,不会发生内存泄露(否则就出现栈平衡问题)。而堆分配由程序员显性控制,人脑不是电脑,总有可能会出现不配对的情况,因此可能出现泄露。

7,使用方式:一般在一个函数内部使用,退出函数就不再使用,占用空间不大的变量,适合栈变量,如果占用空间太大,可能会发生栈溢出的情况。而空间访问不只是局限于特定函数,且大小事先不好确定,或者函数内部使用大块内存的往往用malloc/new从堆上分配比较好。

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-08-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

扫码关注云+社区