关于栈、堆、静态存储区最大可分配大小的探讨
来源:互联网 发布:网络攻击原理与技术 编辑:程序博客网 时间:2024/05/21 13:35
float array[100 000 000];
这个1亿个float变量,这样就有8亿个字节,转化为二进制单位G,就是小于等于1G。这样大小的数组量只能用堆(动态申请内存变量)或者静态存储区(全局变量)来申请。
【栈、堆、静态存储区能申请的最大分配大小是多少呢?】
栈(stack)大小与编译器有关。
默认情况下,visual studio 2010 的栈大小为1M。但在平时应用程序中,由于函数会使用栈结果,所以只能用略小于1M大小的栈。
对于64位和32位程序,结果都是一样的,因为VS2010已经设定好了默认的栈大小了。
const int nStackSize = 249036; // 这是0.95M
int b[nStackSize];
for(int i=0;i< nStackSize;++i)
b[i] =0;
std::cout << b[nStackSize-1];
静态存储区(全局变量)与编译器有关(不保证正确)
默认情况下,VS2010可容纳的全局变量数组大小是2G。由于程序本身的应用,所以只能使用小于2G大小。
const int nGlobalArraySize = 456340275; // 这是1.7G
int arrayG[nGlobalArraySize ];
for(int i= 0;i<456340275;++i)
arrayG[i] =0;
堆(Heap)
对于Heap来说,与程序是32位还是64位,以及编译器都有关。
在VS2010的默认情况下,32位程序可以申请的堆大小最大是2G。实际上只能小于2G。
而64位程序,如果没有虚拟内存(硬盘)的支持,则可以使用128G的内存(比如说,你有8G内存,就可以使用8G内存)。而如果你把虚拟内存开启,则可以理论上得到16TB的内存使用大小[2].
下面的程序中,32位程序申请1.8G内存。64位程序下,开启300G虚拟内存,我们申请256G内存。
小细节:由于C++自己的考虑,new操作在64位下也只能最多获得4G内存,而用C函数malloc则可以得到理论上的内存大小[3].
#ifdef _WIN64
int *arrayNew = (int*)malloc(sizeof(int)*68719476736); // 256G
std::cout << "Now test memory bits: ";
std::cout << log((double)sizeof(int)*68719476736)/log(2.0) << " bit" << std::endl;
if(arrayNew!=NULL)
std::cout << "malloc function return OK!" << std::endl;
delete []arrayNew;
std::cout <<"delete OK" << std::endl;
#else
int *arrayNew = new int [483183820]; // 1.8G
std::cout << sizeof(arrayNew[0])*483183820 << std::endl;
for(int i=0;i<483183820;++i)
arrayNew[i] = 0;
delete []arrayNew;
#endif
总结
总结一下,在默认情况下,栈只能得到1M大小的内存,全局静态储存可以得到2G,而在32位和64位下的堆则可以得到2G和无限内存(一般不会用到16T)。
这里也感慨一下,之前一个项目中要使用SuperLu(一个数学库,用于矩阵分解,分解时无法使用虚拟内存),由于该库本身的一些问题,对于超过60,000左右的顶点数(Vertex),32位的机子就段错误了。而如果使用物理内存为8G的64位机子(64位CPU,64位windows7,编译成64位程序),则可以快速,准确的计算出结果。
因此,在使用大容易内存的程序中,我推荐大家使用 大容易物理内存,大容易虚存的 64位机子,并且编译成64位程序。
- 关于栈、堆、静态存储区最大可分配大小的探讨 --海量之一
- 关于栈、堆、静态存储区最大可分配大小的探讨
- 关于栈、堆、静态存储区最大可分配大小的探讨
- 关于栈、堆、静态存储区最大可分配大小的探讨
- 关于栈、堆、静态存储区最大可分配大小的探讨
- 关于栈、堆、静态存储区最大可分配大小的探讨
- 内存空间分配 堆、栈、静态存储区的区别
- 静态存储区、栈、堆的内存分配
- 关于堆、栈、静态存储区的一些总结
- 内存分配——静态存储区 栈 堆
- 内存分配——静态存储区 栈 堆
- 内存分配——静态存储区 栈 堆
- 内存分配——静态存储区、栈、堆
- 内存分配——静态存储区 栈 堆
- 内存分配——静态存储区 栈 堆
- 内存分配——静态存储区 栈 堆
- 内存分配——静态存储区 栈 堆
- 内存分配——静态存储区 栈 堆
- iPhone 开发过程中的一些小技术的总结
- 导入的ANDROID 项目没有ANDROID的JAR包
- pdo fetch模式
- 借我一生
- vim全局替换命令及正则表达式
- 关于栈、堆、静态存储区最大可分配大小的探讨
- 在哪里解决我们的问题?
- Java程序员必须掌握的知识
- Java 程序员必须知道的10个调试技巧
- 如何查看oracle执行计
- 百度是如何让我们的网速变慢的
- 做饭记
- 面试训练求1+2+...n
- VIM常用替换