关于为什么要进行人工的动态分配内存

举个简单的例子,你是要把你这辈子要吃的盐巴全部买下来,还是说你的盐巴什么时候不够了再去买?
你能确定你这辈子吃多少盐巴吗?

当然你可以估计出来,也可能估计的差不多,但是你肯定不会这么做,合理的方法是,随用随买,我是这么理解的


有些时候,你根本不清楚你即将处理的数据有多大,你用来缓存的内存够用吗。

举个例子,C风格的字符串跟STL的 string,那个好用,不用多说。
为何好用,就是你用前者,如果不自己动态分配内存,就要写死一个MAX,这个MAX过大,浪费内存,太小,很有可能在某次处理的时候不够用。

栈才有2兆大小,不动态,如果超过两兆,就不灵了


如果已知要用的空间不大且大小是预知的范围内,直接用栈就好了。用堆可以申请4G的内存空间,一般的栈也就2M,而且一不小心就会面对栈溢出的问题。

假设需要完成这样一个任务:
从某个文件中读取若干个整数,将它们排序, 输出到另一个文件。


我们不知道“若干个”到底是多少个, 可能是几个, 也可能是几万个,几百万个,几千万个……
楼主打算怎么做呢?

首要要弄清楚 堆和栈的区别:
栈是线程相关的  一个线程会建立一个栈,函数中的局部变量 实际上是在栈里面的  函数返回后 就从栈中pop出来,栈的容量是有限的  超过一定大小就栈就会击穿了,比如你写了深层次的递归,然后再函数中使用大量的数组,很容易就击穿了
堆是动态存储空间,一个进程默认只有一个堆,进程中所有的线程都共享这个堆的空间,所以你在一个线程中从堆中分配内存,再另一个线程中也可以访问,同时堆也更容易扩展和交换数据

对于要处理的数据我们常常会不知道到底有多大,所以采用动态开辟的方法,这样才可以更加合理的对数据进行处理

数组和动态分配是两个相对的东西,在处理数据变化较小时,可以设定一个数组上限,前提是待处理的数据不能超过这个上限,这个时候用数组是较好的.但如果数量变化较大而又无法确定数据上限到底有多大时,这个时候最好是用动态分配,不然的话,就像前面人提到如果使用一个数组的话,太小了可能会溢出,太大了又有可能会浪费.
如果用到递归,最好尽量避免用局部数组,如果一定要用数组的话,那最好改为static类型的数组

在一些简单的小程序里,动态分配看不出优势来,但是在一些大程序里,有很多的不确定的变量,如果不用动态分配的话,工作量是很大,还造成资源浪废,要知道在电脑里资源是很缺的

对一个对象的操作,特别是大小未知的时候,常用动态分配。

虽然是由于对象大小的不确定性 貌似导致动态分配很有必要,但我认为最主要原因应该是栈太小的限制。
特别是对于进程本身不大,但是可能操作很大的数据时,就可以使用动态分配内存处理数据,二栈就安排很小但够用就可以 了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值