编译环境为 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++开大数组溢出问题相关推荐

  1. pat题解java,1039 到底买不买 (20分) Java题解 PAT (Basic Level) Practice (中文)- 巧妙开大数组减少代码量...

    1039 到底买不买 (20分) 原题链接:传送门 一.题目: 输入样例 1: ppRYYGrrYBR2258 YrR8RrY 输出样例 1: Yes 8 输入样例 2: ppRYYGrrYB225 ...

  2. 栈空间不够会报错吗_c++如何解决大数组栈内存不够的问题

    在c++中,我们可以直接通过下面的方式创建一个数组: const int N = ; const int Nx = 10; const int Ny = 10; double phi[N][Nx][N ...

  3. c++如何解决大数组栈内存不够的问题

    在c++中,我们可以直接通过下面的方式创建一个数组: const int N = 6; const int Nx = 100; const int Ny = 100; double phi[N][Nx ...

  4. 【linux】Valgrind工具集详解(十):SGCheck(检查栈和全局数组溢出)

    一.概述 SGCheck是一种用于检查栈中和全局数组溢出的工具.它的工作原理是使用一种启发式方法,该方法源于对可能的堆栈形式和全局数组访问的观察. 栈中的数据:例如函数内声明数组int a[10],而 ...

  5. php in_array 遍历,in_array大数组查询性能问题

    问题 最近在实现一个项目接口的时候发现当数组过大的时候,数据返回的速度有点慢.接口数据返回最长反应时间2s,经过反复调试发现代码段耗时最长的部分在in_array()函数. 解决过程 在stackov ...

  6. php大数组循环嵌套的性能优化

    一.前言 博主最近在用elasticsearch做项目,查出来的数据都是数组,在筛选数据组装数据的时候,难免会碰到循环嵌套的问题.如果两个50000的数组循环嵌套,那实际运算则是50000*50000 ...

  7. php 循环大数组 卡死,PHP 大数组循环问题_PHP教程

    小妹刚刚改投PHP门下.领导叫我把这段代码的执行效率优化一下 我现在知道的优化就是小循环外面,好像在这没啥用. 请问各位大侠我该怎么优化ne ? 领导说放内存里什么的. 基本就是2个大数组不停的循环算 ...

  8. java游戏主角叶开,逸之老板的天机城与叶开大神女魃墓,决赛场上谁更抢眼?...

    精锐组:逸之老板的天机城与叶开大神女魃墓,决赛场上谁更抢眼? ①逸之老板150级无级别刀,出场效果到底是不是很一般? "吃货分队"逸之的天机城在精锐组也算是佼佼者,扛上150级无级 ...

  9. 如何将大数组转成BIN文件

    嵌入式开发中,常需要把一些资源文件转成数组储存,由于嵌入式资源有限,数组太大也不行,如何将大数组转成BIN文件直接DOWNLOAD到FLASH中成了个大问题,本文将用C2B转换助手来解决这个问题,下列 ...

  10. C语言的二维数组初始化的几种方式介绍(私藏大数组初始化方式)

    C语言的二维数组初始化的几种方式介绍 1.直接赋值 2.循环对每个元素赋值 3.借用memset/memset_s初始化为0或-1 4.`数组所有元素初始化为相同值(用于大数组初始化贼方便)` 1.直 ...

最新文章

  1. 配置Tomcat监听80端口 配置Tomcat虚拟主机 Tomcat日志
  2. 为了测试Writer的发图功能,也为了让girls现身。
  3. matlab 多次求解偏微分方程 ode45
  4. iOS和android的屏幕适配
  5. android长截屏代码,android长截屏原理及实现代码
  6. gateway坑点:gateway有Controller时会直接处理对应的路径并返回
  7. Find和FirstOrDefault()有什么区别?
  8. mamcache登录、_gomemcache首页、文档和下载 - memcache客户端库 - Go语言中文网 - Golang中文社区...
  9. 微软宣布 SQL Server 2019 免费支持 Java
  10. JAVA中“:”的用法详解
  11. C# 值类型和引用类型
  12. Windows中cmd命令启动Oracle数据
  13. 群晖-VideoStation-(TMDB刮削器)api申请
  14. 精雕软件怎么把图片转成灰度图_精雕软件怎样保存bmp
  15. 设置页面默认为繁体字
  16. Wallpaper Engine使用视频壁纸黑屏解决方法(window10)
  17. R 语言 ARMA 建模
  18. 人工智能之语音机器人
  19. 获取Mac地址getMacAddress
  20. afterlogic webmail lite php,AfterLogic WebMail最新版任意文件包含 | CN-SEC 中文网

热门文章

  1. leetcode: super washing machines
  2. 远程服务器配置 Anaconda 并安装 PyTorch 详细教程
  3. 畊宏女孩必读:代餐奶昔到底可以减肥吗?
  4. 2016NOIP普级组第一题--买铅笔(参考洛谷题解)
  5. wps中如何插入参考文献
  6. 哪款电容笔好用?开学季值得买电容笔推荐
  7. 想要批量打印WPS表格或Excel文件?有三种方法,第一种最好用
  8. 自媒体视频如何原创?自媒体原视频制作流程,5步就够了
  9. 自适应学习会议笔记总结
  10. 《鸟叔-视频》(6-1)