类对象定义时的堆栈问题

前言


 

  我们可能会对不同定义形式下类对象在堆栈中是如何分配的感到好奇,现在就举一个例子进行分析。

 

举例分析


  

1、 A a(); //隐式,栈中分配
2、 A b = A(); //显式,栈中分配
3、 A *a = new A(); //堆中分配

 

  对于前两种情况,内存是在进程虚拟地址空间中开的一块栈的内存,而后一种情况是在堆中开的内存。而且堆的大小远大于栈的大小

 

  它们的区别主要是在于内存大小和回收问题,由于堆栈(简称为栈 stack )是系统数据结构,所以统一由操作系统操作,系统自动地帮你申请释放内存,Linux中可以用命令ulimit -s (单位是kb)来查看进程中栈的内存。

 

  堆就不一样了,开发者需要参与堆的管理,手动的 free() 掉已经申请的空间。开发者的使用将直接影响系统的性能。

  

总结


 

  1、在堆栈的大小已知且保证不会超过的情况下,优先使用堆栈能保证效率

 

  2、在堆栈的大小未知的情况下,为了防止stack overflow ,优先使用堆

 

posted @ 2017-11-08 20:48  bw98  阅读(310)  评论(0编辑  收藏  举报