C/C++开大数组溢出问题
编译环境为 codeblocks 17.12
编译的语言为C++
- 问题描述
数据结构作业,老师要求用 100 W 的随机数做排序,测试各种排序算法的时间及性能。在作业的过程中就发现,当直接开辟数组超过一定大小后会产生溢出,这里就涉及到 C++ 如何开辟大数组的问题
直接开辟 100w 大小数组,内存溢出。
- 产生原因
用 C 语言直接定义数组,数组空间是开辟在 C 语言占用内存空间的栈区,而栈区开辟的内存有限导致内存溢出。
这里需要普及一下C语言内存分配的问题,C语言占用的内存可以分为5个区:
①代码区(Text Segment):用于放置编译过后的代码的二进制机器码。
②堆区(Heap):用于动态内存分配。一般由程序员分配和释放,若程序员不释放,结束程序时有可能由操作系统回收。(其实就是malloc()函数能够掌控的内存区域)
③栈区(Stack):由编译器自动分配和释放,一般用来存放局部变量、函数参数(敲黑板划重点了!)。
④全局初始化数据区/静态数据区(Data Segment):顾名思义,就是存放全局变量和静态变量的地方。这个区域被整个进程共享。
⑤未初始化数据区(BSS):在运行时改变值。改变值(初始化)的时候,会根据它是全局变量还是局部变量,进到他们该去的区。相当于临时存放的一个地方,不知道设置这个区的意义是什么,这个有待进一步研究。
在 Windows 下,Data Segment 的所允许的空间大小取决于剩余内存的大小,也就是说,如果电脑剩余 8 G 内存的话,int 类型的二维数组甚至可以开到 46340*46340 的大小,没有亲自试验过。
而Stack的空间只有 2 M !也就是 210241024=2097152 字节,局部变量空间顶多放得下下 524288 个 int 类型,这也就是为什么数组直接开 100 w 大小会爆掉。
- 解决办法
方法一:用 malloc( ) 函数定义数组,这样可以将数组开辟在堆区。
方法二:定义全局变量或者静态变量,这两者的作用和效果都是一样的。
对于百万级别的数组,这两种办法都能够很好的解决。
- 下面我们测试一下这两种方法下数组开到多大会爆掉。。
第一方法:下面是我手调加上程序得出来的能开辟出来的最大空间
491,830,259*4=1,967,321,036(字节)
1,967,321,036 / 1024 ≈ 1,921,211 (KB)
1,921,211 / 1024 ≈ 1876 (MB)
我的电脑总内存是 8 GB ,能够开到这么大也算合理,具体可能会因为电脑配置的不同而不一样。
第二种方法:直接测试上面的最大值,可以看出,没有问题。
继续往上加到这个数的时候出现了可能崩的情况
可以看出这种分配方法跟计算机的内存应该有很大的关系,但是跟上面方面最大能开辟的空间差距不大。最大都是不到 2 GB,不管用什么方法 2 GB 应该都是极限了,但是这个足够应付我们的日常编程,哪怕是暴力解法,两种方法都是可取的,个人偏向于方法一,便于内存的回收。
C/C++开大数组溢出问题相关推荐
- pat题解java,1039 到底买不买 (20分) Java题解 PAT (Basic Level) Practice (中文)- 巧妙开大数组减少代码量...
1039 到底买不买 (20分) 原题链接:传送门 一.题目: 输入样例 1: ppRYYGrrYBR2258 YrR8RrY 输出样例 1: Yes 8 输入样例 2: ppRYYGrrYB225 ...
- 栈空间不够会报错吗_c++如何解决大数组栈内存不够的问题
在c++中,我们可以直接通过下面的方式创建一个数组: const int N = ; const int Nx = 10; const int Ny = 10; double phi[N][Nx][N ...
- c++如何解决大数组栈内存不够的问题
在c++中,我们可以直接通过下面的方式创建一个数组: const int N = 6; const int Nx = 100; const int Ny = 100; double phi[N][Nx ...
- 【linux】Valgrind工具集详解(十):SGCheck(检查栈和全局数组溢出)
一.概述 SGCheck是一种用于检查栈中和全局数组溢出的工具.它的工作原理是使用一种启发式方法,该方法源于对可能的堆栈形式和全局数组访问的观察. 栈中的数据:例如函数内声明数组int a[10],而 ...
- php in_array 遍历,in_array大数组查询性能问题
问题 最近在实现一个项目接口的时候发现当数组过大的时候,数据返回的速度有点慢.接口数据返回最长反应时间2s,经过反复调试发现代码段耗时最长的部分在in_array()函数. 解决过程 在stackov ...
- php大数组循环嵌套的性能优化
一.前言 博主最近在用elasticsearch做项目,查出来的数据都是数组,在筛选数据组装数据的时候,难免会碰到循环嵌套的问题.如果两个50000的数组循环嵌套,那实际运算则是50000*50000 ...
- php 循环大数组 卡死,PHP 大数组循环问题_PHP教程
小妹刚刚改投PHP门下.领导叫我把这段代码的执行效率优化一下 我现在知道的优化就是小循环外面,好像在这没啥用. 请问各位大侠我该怎么优化ne ? 领导说放内存里什么的. 基本就是2个大数组不停的循环算 ...
- java游戏主角叶开,逸之老板的天机城与叶开大神女魃墓,决赛场上谁更抢眼?...
精锐组:逸之老板的天机城与叶开大神女魃墓,决赛场上谁更抢眼? ①逸之老板150级无级别刀,出场效果到底是不是很一般? "吃货分队"逸之的天机城在精锐组也算是佼佼者,扛上150级无级 ...
- 如何将大数组转成BIN文件
嵌入式开发中,常需要把一些资源文件转成数组储存,由于嵌入式资源有限,数组太大也不行,如何将大数组转成BIN文件直接DOWNLOAD到FLASH中成了个大问题,本文将用C2B转换助手来解决这个问题,下列 ...
- C语言的二维数组初始化的几种方式介绍(私藏大数组初始化方式)
C语言的二维数组初始化的几种方式介绍 1.直接赋值 2.循环对每个元素赋值 3.借用memset/memset_s初始化为0或-1 4.`数组所有元素初始化为相同值(用于大数组初始化贼方便)` 1.直 ...
最新文章
- 配置Tomcat监听80端口 配置Tomcat虚拟主机 Tomcat日志
- 为了测试Writer的发图功能,也为了让girls现身。
- matlab 多次求解偏微分方程 ode45
- iOS和android的屏幕适配
- android长截屏代码,android长截屏原理及实现代码
- gateway坑点:gateway有Controller时会直接处理对应的路径并返回
- Find和FirstOrDefault()有什么区别?
- mamcache登录、_gomemcache首页、文档和下载 - memcache客户端库 - Go语言中文网 - Golang中文社区...
- 微软宣布 SQL Server 2019 免费支持 Java
- JAVA中“:”的用法详解
- C# 值类型和引用类型
- Windows中cmd命令启动Oracle数据
- 群晖-VideoStation-(TMDB刮削器)api申请
- 精雕软件怎么把图片转成灰度图_精雕软件怎样保存bmp
- 设置页面默认为繁体字
- Wallpaper Engine使用视频壁纸黑屏解决方法(window10)
- R 语言 ARMA 建模
- 人工智能之语音机器人
- 获取Mac地址getMacAddress
- afterlogic webmail lite php,AfterLogic WebMail最新版任意文件包含 | CN-SEC 中文网