数组元素过多应该怎么处理?

数组元素过多应该怎么处理?

我们在编程的时候,经常要运用数组。但它有一个众所周知的缺点,就是要在使用前就规定它的长度。
那是不是说我规定一个贼大的数不就完事?
当然不行了,为什么呢?我们先从内存空间讲起。
首先要知道,在你家的编译器看来,内存分为栈内存堆内存静态存储区,这里只是粗略介绍一下。

  1. 栈内存是编译器自动分配和释放的空间,存一些局部变量啦
    栈是一块连续的内存区域,大小是操作系统预定好的,windows下栈大小是2M(也有是1M,与操作系统、硬件等有关,部分编译器中可设置)

  2. 堆内存比较高级,是用户自己申请、释放的空间,比如动态申请new。记得释放,内存泄露了别怪我
    堆是不连续的内存区域,大小受限于计算机系统中有效的虚拟内存(32bit系统理论上是4G)
    定义参考
    根据《Windows核心编程 第五版》,windows线程栈内存默认情况下是1MB,而对于堆内存,虽然默认堆也是1MB,但是“系统可以增大进程的默认堆”(用到虚存)

  3. 静态存储区在程序编译的时候就已经分配好,且在程序的整个运行期间都存在,比如全局变量。也是很大的。

讲了这么多,都不重要。重要的是:堆内存比栈内存大很多

我们回到之前的问题,我为啥不能定义一个很大长度的数组?
首先占用内存不说,开辟了这么空间不用是很浪费的。 而且栈内存小哇,你开辟再大栈内存就这么p点,还是不满足你的需求。
那能怎么办呢?有两种方法:

1. 将数组定义为全局变量

方法的本质是,不在栈内存而在静态存储区分配空间。
之前的铺垫终于用到啦!由于我们一般在main函数中使用数组,显然是局部变量,在占内存中。那么我们在main函数(所有函数)外定义数组,那么它就是一个全局变量,存于静态存储区中。静态存储区比栈内存大啊,自然能定义更长的数组了。

2. 动态分配数组

方法的本质是,不在栈内存而在堆内存分配空间。
用new关键字经行动态申请新空间,因为是在堆内存中不是连续的空间,同理,更大的空间,更长的数组。不同于栈内存,自动回收不用的空间,堆内存的空间会一直存在,直至程序结束。因此记得用delete关键字将new出来的但是不用的空间进行回收,避免内存泄漏。

你可能感兴趣的:(数据结构)