堆和栈

作者: 蛋奶星星爱学习 | 来源:发表于2018-07-03 18:34 被阅读0次

    堆和栈在内存地址空间中的位置是不一样的,堆向上增长,而栈向下增长;其次,他们的功能也不一样,堆中的空间程序员可以自己分配(malloc),而栈是系统自动分配,主要用于函数调用;第三,从效率来看,栈的效率更高些,因为堆是用链表管理的,分配效率相对低了些。

    栈上分配的空间是临时的,在函数退出后将被系统释放,不会造成内存泄露,不得用delete或free操作,因为栈的空间小,所以在栈上不能获得大量的内存块,一般最大也就不到10M。

    堆是在整个进程的未分配空间中分配的内存,由malloc或new分配,一般必须由free或delete释放。堆上可以分配大量的内存,只要你的机器吃得消。  一般来说,由new和malloc分配的内存都在堆上,全局变量也在堆上(但是不是new,malloc出来的也会自动清理)。函数内部的其他变量和常量都在栈上。

    c++内存格局通常分为:全局数据区、代码区、栈区、堆区

    1、栈区(stack)—   由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

    2、堆区(heap) —   一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式类似于链表。

    3、全局区(静态区)(static)— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放

    4、文字常量区  —常量字符串就是放在这里的。 程序结束后由系统释放

    5、程序代码区—存放函数体的二进制代码。

    从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的。

    所有的方法调用都是通过栈来进行的,所有的局部变量,形式参数都是从栈中分配内存空间的。

    但是堆的优点在于,编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。事实上,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.在C++中,要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间,这也正是导致效率低的原因。

    相关文章

      网友评论

          本文标题:堆和栈

          本文链接:https://www.haomeiwen.com/subject/ctpjuftx.html