zoukankan      html  css  js  c++  java
  • 关于为什么要进行人工的动态分配内存

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

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


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

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

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


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

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


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

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

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

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

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

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

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

  • 相关阅读:
    迅为4412开发板实验Menuconfig_Kconfig(上)
    迅为IMX6ULL开发板Linux 4G通信实验
    迅为IMX6ULL开发板Linux RS232/485驱动实验(下)
    迅为4412开发板实验_Makefile编译(下)
    迅为IMX6Q开发板QtE5.7编译(上)
    迅为干货 | iTOP-4418/6818移植mt6620热点
    UDT源码剖析(十一)之SendQueue And RecvQueue
    UDT源码剖析(九)之CCC
    UDT源码剖析(十)之Channel
    UDT源码剖析(八)之Cache
  • 原文地址:https://www.cnblogs.com/fag888/p/5789184.html
Copyright © 2011-2022 走看看