(转)关于栈、堆、静态存储区最大可分配大小的探讨 --海量之一
中午看《编程之美》的第2.5节中有这么一小段程序:
float array[100 000 000];
这个1亿个float变量,这样就有8亿个字节,转化为二进制单位G,就是小于等于1G。这样大小的数组量只能用堆(动态申请内存变量)或者静态存储区(全局变量)来申请。
好了,转入今天要讲的正题。到底栈、堆、静态存储区能申请的最大分配大小是多少呢?
栈(stack)栈大小与编译器有关。
默认情况下,visual studio 2010 的栈大小为1M。但在平时应用程序中,由于函数会使用栈结果,所以只能用略小于1M大小的栈。
对于64位和32位程序,结果都是一样的,因为VS2010已经设定好了默认的栈大小了。
<< std::endl; 07??08????if(arrayNew!=NULL) 09????????std::cout << "malloc function return OK!" << std::endl; 10??11????delete []arrayNew; 12????std::cout <<"delete OK" << std::endl; 13??14#else 15??16????int *arrayNew = new int [483183820];??? // 1.8G 17??18????std::cout << sizeof(arrayNew[0])*483183820 << std::endl; 19??20????for(int i=0;i<483183820;++i) 21????????arrayNew[i] = 0; 22????delete []arrayNew; 23??24#endif总结总结一下,在默认情况下,栈只能得到1M大小的内存,全局静态储存可以得到2G,而在32位和64位下的堆则可以得到2G和无限内存(一般不会用到16T)。
这里也感慨一下,之前一个项目中要使用SuperLu(一个数学库,用于矩阵分解,分解时无法使用虚拟内存),由于该库本身的一些问题,对于超过60,000左右的顶点数(Vertex),32位的机子就段错误了。而如果使用物理内存为8G的64位机子(64位CPU,64位windows7,编译成64位程序),则可以快速,准确的计算出结果。
因此,在使用大容易内存的程序中,我推荐大家使用 大容易物理内存,大容易虚存的 64位机子,并且编译成64位程序。
[1]. CSDN上的参考:http://topic.csdn.net/u/20090827/02/2b270cfd-acf4-41bb-8654-475a88ee7704.html
[2]. 64位与32位的一些区别 http://bbs02.ly.shangdu.com/dispbbs.asp?boardid=22&Id=172330 4
[3]. malloc与new的区别: http://group.gimoo.net/review/12921
转载请注明: 转载自Knight.Liao's Tale
本文链接地址: 关于栈、堆、静态存储区最大可分配大小的探讨