问题的引出
编程题目中经常会碰到数组的开太大溢出的问题,为了彻底搞清楚数组长度的问题,把数组长度问题总结了一下
理解
1首先要知道c++的内存的分配
全局变量放在静态数据区中
局部变量放在栈区
2不同系统下分配不一样
以下以int(整型)为例
一、Windows下,静态数据区的所允许的空间大小取决于剩余内存的大小,8g说明有8 * 1024 * 1024 * 1024 =2^33的空间,可以开整型(int) 2^33 /4=2^31, 即a[2 * 10^9],
二、但是不同的编译器不一样,一般32位的编译器(如我用的是devcpp),静态数据区只分配大约2g的内存即2 * 1024 * 1024 * 1024=2 ^31 而2 ^31 /4=2 ^29 ≈5.3 * 10^8, 就是只能开10^8到 10^9次方的数组,实测devcpp只能开到int a[498808383]; 不到5 * 10^8
三、但是上面的只是针对全局数据放的静态数据区域,局部变量放在栈区,分配的空间大概只有2m,也就是2 * 1024 * 1024B,如果是int型的数据大概数组的长度为524288 即10^5~ 10^6,在devcpp中 实测最大开到int a[518020] 。
四、如果是竞赛,题目给出256mb,那么意思就是局部变量的大小256mb就是能开大小大约6.7*10^7的长度的数组
总结
对于int型的数组,在编译器,一般全局数组变量能开a[10^8~ 10^ 9],局部数组变量数组能开a[10^5 ~ 10^6]。其他类型数据类似
最后,写这个文章也是为了做个笔记使用,加深自己的理解
如有错误,欢迎到评论区指正