什么是堆、栈以及区别

 首先栈和堆(托管堆)都存在于进程的虚拟内存中,什么是虚拟内存呢?

          虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

        堆(Heap):是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程,C/C++分别用malloc/New请求分配Heap,用free/delete销毁内存。由于从操作系统管理的内存分配所以在分配和销毁时都要占用时间,所以用堆的效率低的多!但是堆的好处是可以做的很大,C/C++对分配的Heap是不初始化的。

        堆的相关特性:

                1,堆是由操作系统管理的一片空间,事先是没有在进程空间里分配的(比如你在没有分配堆的时候就访问堆空间会报一个内存访问错误),一般是由程序动态的分配出来,一旦分配了以后,一般需要程序去释放自己的堆空间.

                2,堆的空间较大,但访问速度没有栈快

                3,堆受垃圾处理器GC管理(GC会去找那些很久没有引用地址指向的内存块,把它们清理掉)


        栈(Stack):是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FILO的特性,在编译的时候可以指定需要的Stack的大小。

        栈的相关特性:

               1,栈上是向下填充的,数据只能从栈的顶端插入和删除(先进后出原则)。把数据放入栈顶称为入栈(push),从栈顶删除数据称为出栈(pop)。

                2,栈的空间较小,但访问速度快。

                3,栈的生长方向是有高地址向低地址生长的。

                4,栈的清理是由系统自动完成的。

堆栈的区别:

        堆栈的不同特性就是两者的区别

        系统会自动的在栈上为其开辟空间。而堆则是程序员根据需要自己申请的空间,例如malloc(10); 开辟十个字节的空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。
 

        堆不分先进后出还是先进先出,堆没有任何访问限制,它就像是你的书架,所有的书都排列在书架上,当你想看某一本书的时候,可以随时找到一本我们需要的书,从书架上把它拿下来。
而栈就像一串糖葫芦,你总是会先吃到最上面那个山楂。

下面介绍一下C程序存储空间中的 代码区、常量区、静态区(全局区)、堆区、栈区

栈区,一般存放存放函数内的局部变量形参函数返回值等。        

堆区,用于保存new 和malloc这些自定义的内存变量;

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

字符常量区, 用于保存字符串;

全局静态区,  用于保存全局变量和静态变量, 全局变量和静态变量的存储区域是在一起的,程序结束后由系统释放。数据区的大小由系统限定,一般很大。

代码区,用于保存程序的二进制代码;

  • 11
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值