数组长度很大的情况

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

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

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

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

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

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

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

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

posted @ 2019-09-18 16:00  蓝jingjing  阅读(485)  评论(0编辑  收藏  举报