堆对象,栈对象与静态对象

1、堆对象

      1、其产生和销毁都要程序员精确定义,也就是说,程序员对堆对象的生命具有完全的控制权。我们常常需要这样的对象,比如,我们需要创建一个对象,能够被多个函数所访问,但是又不想使其成为全局的,那么这个时候创建一个堆对象无疑是良好的选择,然后在各个函数之间传递这个堆对象的指针,便可以实现对该对象的共享。

       2、相比于栈空间,堆空间的容量要大得多。实际上,当物理内存不够时,如果这时还需要生成新的堆对象,通常不会产生运行时错误,而是系统会使用虚拟内存来扩展实际的物理内存。

2、栈对象

     1、栈对象的优势是在适当的时候自动生成,又在适当的时候自动销毁,不需要程序员操心。

     2、栈对象的创建速度一般较堆对象快,因为分配堆对象时,会调用new操作,而new操作会采用某种内存空间搜索算法,搜索过程可能很费时间。而产生栈对象则没有这么麻烦,仅仅需要移动栈顶指针就可以了。

    3、但是栈空间容量较小,一般是1MB~2MB,所 的栈空间也会线性增加,以容量比较大的对象不适合在栈中分配。特别是注意递归函数中最好不要使用栈对象,因为随着递归调用深度的增加,所需的栈空间也会线性的增加,当所需栈空间不够时,便会导致溢出,这样就会产生运行时错误。


3、static对象

        1、首先是全局对象。全局对象为类间通信和函数间通信提供了一种最简单的方式,虽然这种方式并不优雅。一般而言,在完全的面向对象语言中,是不存在全局对象的,比如C#,因为全局对象意味着不安全和高耦合,在程序中过多地使用全局对象将大大降低程序的健壮性、稳定性、可维护性和可复用性。C++也完全可以剔除全局对象,但是最终没有,我想原因之一是为了兼容C。

  2、其次是类的静态成员,上面已经提到,基类及其派生类的所有对象都共享这个静态成员对象,所以当需要在这些class之间或这些class objects之间进行数据共享或通信时,这样的静态成员无疑是很好的选择。

  3、接着是静态局部对象,主要可用于保存该对象所在函数被屡次调用期间的中间状态,其中一个最显著的例子就是递归函数,我们都知道递归函数是自己调用自己的函数,如果在递归函数中定义一个non-static局部对象,那么当递归次数相当大时,所产生的开销也是巨大的。这是因为non-static局部对象是栈对象,每递归调用一次,就会产生一个这样的对象,每返回一次,就会释放这个对象,而且,这样的对象只局限于当前调用层,对于更深入的嵌套层和更浅露的外层,都是不可见的。每个层都有自己的局部对象和参数。
  在递归函数设计中,可以使用static对象替代non-static局部对象(即栈对象),这不仅可以减少每次递归调用和返回时产生和释放non-static对象的开销,而且static对象还可以保存递归调用的中间状态,并且可为各个调用层所访问。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值