(转)关于栈、堆、静态存储区最大可分配大小的探讨 --海量之一

关于栈、堆、静态存储区最大可分配大小的探讨

引:2011-12-31 15:57:31 主要是测试方法 **环境 ,**环境

 

2

1,050 views  | C++

中午看《编程之美》的第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

4

for(int i=0;i< nStackSize;++i)

5

    b[i] =0;

6

7

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].

 

/*66 详细可以看 修养*/

 

 

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

 

源文档 <http://www.liaoqiqi.com/blog/2010/discussion-about-the-memory-allocation-using-heap-stack-static-area/>

转载于:https://www.cnblogs.com/titer1/archive/2011/12/31/2308848.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值