- 浏览: 213253 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
synack:
写的很好,图文并茂,语言简单清晰,赞!
SkipList 跳表 -
king_c:
jiandandecaicai 写道你好,请教一下是如何通过E ...
从Hadoop URL 中读取数据 -
jiandandecaicai:
你好,请教一下是如何通过Eclipse来连接Hadop机群的, ...
从Hadoop URL 中读取数据
中午看《编程之美》的第2.5节中有这么一小段程序:
float array[100 000 000];
这个1亿个float变量,这样就有8亿个字节,转化为二进制单位G,就是小于等于1G。这样大小的数组量只能用堆(动态申请内存变量)或者静态存储区(全局变量)来申请。
好了,转入今天要讲的正题。到底栈、堆、静态存储区能申请的最大分配大小是多少呢?
栈(stack)
栈大小与编译器有关。
默认情况下,visual studio 2010 的栈大小为1M。但在平时应用程序中,由于函数会使用栈结果,所以只能用略小于1M大小的栈。
对于64位和32位程序,结果都是一样的,因为VS2010已经设定好了默认的栈大小了。
1 |
const int nStackSize = 249036; // 这是0.95M
|
2 |
int b[nStackSize];
|
3 |
for ( int i=0;i< nStackSize;++i)
|
4 |
b[i] =0;
|
5 |
std::cout << b[nStackSize-1]; |
静态存储区(全局变量)
对于全局变量来说,与编译器有关(不保证正确)
默认情况下,VS2010可容纳的全局变量数组大小是2G。由于程序本身的应用,所以只能使用小于2G大小。
1 |
const int nGlobalArraySize = 456340275; // 这是1.7G
|
2 |
int arrayG[nGlobalArraySize ];
|
3 |
for ( int i= 0;i<456340275;++i)
|
4 |
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].
01 |
#ifdef _WIN64 |
02 |
|
03 |
int *arrayNew = ( int *) malloc ( sizeof ( int )*68719476736); // 256G
|
04 |
|
05 |
std::cout << "Now test memory bits: " ;
|
06 |
std::cout << log (( double ) sizeof ( int )*68719476736)/ log (2.0) << " bit" << 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位程序。
Reference:
[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
本文链接地址: 关于栈、堆、静态存储区最大可分配大小的探讨
发表评论
-
c++引用计数的本质
2015-03-24 14:26 1243为什么要用引用计数? 场景:代码里X是一个 ... -
COM 数组传输-使用VARIANT传递数组的方法及步骤 .
2015-02-16 17:22 21在使用COM/DCOM写组件时经常要传递数组,一般比如SHO ... -
MFC程序中打印调试信息
2015-01-20 22:11 9711、在要打印调试的类中加上头文件 #include ... -
opencv轮廓提取与轮廓拟合
2015-01-05 09:55 1954#include <iostream> #i ... -
c语言操作二进制文件fopen中fseek的注意事项
2014-11-22 01:04 1131今天在使用fopen的时候,遇到了fseek(fp,0 ... -
C++中delete和delete[]的区别
2014-11-21 23:41 595一直对C++中的delete和delete[]的区别不甚 ... -
缺少streams.h的解决方法
2014-10-09 17:19 1043这几天在学DirectShow的开发,一个streams. ... -
使用ATL创建进程外组件
2014-03-24 22:39 1166一、建立一个进程外组件1)打开菜单File|New,选择Pr ... -
vector 转换成 数组 - [C++]
2013-12-13 18:06 4653参考: http://topic.csdn.n ... -
ref:Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器
2013-09-09 00:21 795原文地址:http://www.s135.com ... -
openMP
2013-06-08 23:32 950最近在看多核编程。简单来说,由于现在电脑CPU一般都有两 ... -
nafxcw.lib与LIBCMT.lib在vs2008中链接冲突解决方案
2013-05-09 09:51 9361>正在链接...1>nafxcw.lib(af ... -
Errore HTTP 404.2 - Not Found" IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理
2012-11-20 17:46 938如题,这个错误google时一大堆各种各样的解决办法,但 ... -
JAVA中的数据存储(堆及堆栈)
2012-11-06 21:40 1049在JAVA中,有六个不 ... -
error : Please use the /MD switch for _AFXDLL builds 的解决方法
2012-09-20 21:14 2647在用vs打开项目后,编译的时候出现“Please use ... -
共享内存的例子(转msdn)
2012-06-02 19:18 1414Creating Named Shared Memo ... -
使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明
2012-03-17 22:47 1240在网上看到很多网友在.NET程序中调用Win32 API, ... -
c语言内存分配 2
2012-02-21 18:00 869二、栈(stack)和堆(heap)具体的区别。 ... -
向上取整
2012-02-12 16:30 1316假设变量x和n ... -
lib and dll
2012-01-12 14:04 828使用静态调用方式时,需要将在生成动态链接库时产生的lib ...
相关推荐
C++_静态存储区_栈_堆的区别
内存分配——静态存储区 栈 堆.doc 很好的讲解。
C/C++语言 数据在内存中存储的方式 静态存储区、堆、栈
C++ 静态存储区 栈 堆。让你更好的了解c++
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放。 4、...
CC++堆、栈及静态数据区详解,详细解释CC++里的堆、栈及静态数据区
本篇文章是对C++中静态存储区与栈以及堆的区别进行了详细的分析介绍,需要的朋友参考下
局部变量与全局变量区别,栈、堆和静态存储区的区别[借鉴].pdf
C++堆栈自由存储区全局静态...C++堆栈自由存储区全局静态存储区和常量存储区C++堆栈自由存储区全局静态存储区和常量存储区 C++堆栈自由存储区全局静态存储区和常量存储区 C++堆栈自由存储区全局静态存储区和常量存储区
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。下面分别来介绍: 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部...
在C++中,内存可分为系统数据区,自由存储区,文本区,const数据区,全局静态区,堆区和栈区
栈的静态实现代码
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字...
主要讲了C++的内存管理,使读者对C++内存的管理有一定帮助!
网站伪静态的实现方法----内含说明与jar包网站伪静态的实现方法----内含说明与jar包网站伪静态的实现方法----内含说明与jar包网站伪静态的实现方法----内含说明与jar包网站伪静态的实现方法----内含说明与jar包网站...
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另 一块区域。 - 程序结束后由系统释放。 4、...
全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量、未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 文字常量区 —...
3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。4、文字常量区...