`
king_c
  • 浏览: 222748 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 
阅读更多

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

分享到:
评论

相关推荐

    C++_静态存储区_栈_堆的区别

    内存可以被划分为几个不同的区域,其中最常见的是静态存储区、栈(Stack)和堆(Heap)。每种存储区都有其特定的用途和特点,了解它们之间的区别对于编写高效且健壮的代码至关重要。 ### 静态存储区 静态存储区...

    静态存储区 堆 栈

    静态存储区、堆和栈是C/C++语言中三种不同的内存分配方式,它们之间有着不同的特点和应用场景。 一、静态存储区 静态存储区是在程序编译时就已经分配好的内存空间,这块内存在程序的整个运行期间都存在。它主要...

    C++ 静态存储区 栈 堆的区别.txt

    ### C++中的静态存储区、栈与堆的区别 在C++编程语言中,根据变量的存储方式和生命周期,可以将内存区域大致分为四个部分:静态存储区、栈、堆以及未初始化的数据段(BSS)。其中,静态存储区、栈与堆是程序运行时...

    内存中堆和栈的分配区别

    在计算机科学领域,内存管理是实现程序高效运行的关键技术之一,而其中的堆(Heap)与栈(Stack)是两种核心的内存分配方式。本文将深入探讨这两种内存区域的分配区别,以及它们在程序中的作用机制,帮助读者理解C/...

    静态区、堆、栈 区别

    在深入探讨“静态区”、“堆”和“栈”的区别之前,我们首先需要了解一个由 C/C++ 编译的程序在运行时如何分配内存。程序的内存大致可以分为以下几部分: 1. **栈区(Stack)**: - **功能**:由编译器自动分配和...

    C++堆栈自由存储区全局静态存储区和常量存储区 C++堆栈自由存储区全局静态存储区和常量存储区

    根据给定的信息,本文将对C++中的四种存储区域——堆栈、自由存储区、全局静态存储区以及常量存储区进行详细的解析。 ### 一、堆栈(Stack) 堆栈是程序运行时的一种重要的存储区域,它由操作系统管理,并且在函数...

    C++堆、栈及静态数据区详解

    本文将深入探讨C++中的堆、栈以及静态数据区,帮助理解这些内存区域的区别和使用场景。 1. 栈(Stack): 栈是编译器自动管理的内存区域,主要用来存放函数参数、局部变量等。每当进入一个函数调用,栈就会为函数的...

    C++中静态存储区与栈以及堆的区别详解

    内存分为几个不同的区域,分别是静态存储区、栈区和堆区,每个区域都有其特定的用途和管理规则。 1. 静态存储区: - 静态存储区在程序编译时就已分配好,且在程序整个运行期间都存在。 - 这个区域主要存储静态...

    内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区

    ### 内存区划分、内存分配详解 #### 一、内存区域概述 在C和C++编程语言中,程序运行时使用的内存可以被划分为不同的区域,每种区域都有其特定的功能和生命周期。理解这些区域如何工作对于有效地管理和优化程序...

    C++堆栈自由存储区全局静态存储区和常量存储区

    ### C++中的堆栈、自由存储区、全局静态存储区和常量存储区 在C++编程语言中,根据变量的生命周期与作用域的不同,内存被划分为几个不同的区域进行管理,包括堆栈(Stack)、自由存储区(Free Store)、全局静态...

    堆和栈内存分配(详细)

    本文将深入探讨堆和栈的区别,包括它们的内存分配特点、应用场景以及如何高效利用这两种内存区域。 #### 一、预备知识:程序的内存分配 在C/C++程序中,内存被细分为多个区域,以适应不同的需求: 1. **栈区...

    探究内存中栈、堆和数据区的分配和管理

    ### 探究内存中栈、堆和数据区的分配和管理 #### 存储时与运行时内存分配 计算机程序的内存管理对于程序的稳定性和性能至关重要。在程序的生命周期中,内存分配主要分为存储时(编译时)和运行时两个阶段。 - **...

    内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理]

    本文将深入探讨标题和描述中提到的几个关键概念:内存区划分、内存分配、常量存储区、堆、栈、自由存储区和全局区。 首先,我们来看内存区划分。在C++中,内存被分为以下几个主要区域: 1. **常量存储区**:存储...

    局部变量与全局变量区别,栈、堆和静态存储区的区别[借鉴].pdf

    局部变量与全局变量区别、栈、堆和静态存储区的区别 变量是编程语言中最基本的概念之一,它们可以存储不同的数据类型,并在程序中发挥着重要的作用。在 C++ 中,变量根据定义位置的不同,具有不同的作用域,可以...

    C语言程序编译的内存分配,堆与栈的区别

    C语言程序在执行时会根据不同的需求将内存划分为几个不同的区域,主要包括:栈区、堆区、全局/静态存储区以及文字常量区。每个区域都有其特定的功能和使用场景。 #### 二、栈区(Stack) 栈区是由编译器自动管理的...

    c++堆和栈及内存的使用分配

    在C++编程中,了解堆和栈以及内存的使用分配是非常关键的。下面将详细解释这些概念。 **一、栈区(Stack)** 栈区主要存放函数参数值和局部变量。这部分内存由编译器自动分配和释放。当函数调用结束时,栈区内的...

    详尽的堆与栈的区别与深入

    - `p2` 和 `p3` 是局部指针,位于栈上,`p3` 指向静态存储区的一个字符串; - `c` 是静态局部变量,位于全局静态存储区; - 通过 `malloc()` 分配的 `p1` 和 `p2` 指向堆内存中的位置。 #### 八、访问效率比较 在...

    堆内存和栈内存详解.doc

    - 通常在堆的头部存储一个字节表示堆的大小。 - 堆中的具体内容由程序员自行安排。 #### 三、例子程序分析 以下是一个示例程序,展示了堆和栈内存的使用: ```cpp int a = 0; // 全局初始化区 char* p1; // ...

    堆和栈的区别详细说明

    通过以上的分析可以看出,栈和堆在内存管理方式、空间大小、是否产生碎片、生长方向、分配方式以及分配效率等方面都有着明显的不同。栈适合于管理生命周期短的局部变量和函数调用,而堆则更适合于管理生命周期较长的...

    全局静态存储区、堆区和栈区深入剖析

    程序的内存主要分为几个不同的区域,包括系统数据区、自由存储区、文本区、const数据区、全局静态区、堆区和栈区。这些区域各自有着特定的用途和管理规则。 全局静态存储区是存放由`static`关键字标识的数据的地方...

Global site tag (gtag.js) - Google Analytics