【C++ 内存管理】静态分配和动态分配

【C++ 内存管理】静态分配和动态分配_静态分配内存和动态分配内存-CSDN博客

1.静态分配
定义:
在编译阶段确定内存大小和生命周期,由编译器自动分配和释放。

特点:
①分配时机:程序启动时分配,程序结束时释放。
②内存区域:数据段(全局变量或者静态变量)和栈区。
③生命周期:与程序或模块的执行周期一致。
④大小固定:内存大小在编译时已知,不可动态调整。
⑤无需手动管理:由编译器自动释放。

2.动态分配
定义:
在程序运行阶段动态分配内存,由程序员显示控制。

特点:
①分配时机:运行时动态申请(如 malloc, new)和释放(如 free, delete)。
②内存区域:堆区或者栈区(栈可以通过函数_alloca进行动态分配,不过注意,所分配空间不能通过free或delete进行释放)。
③生命周期:由程序员显示控制。
④大小可变:内存大小在运行时确定,可动态调整(如 realloc)。
⑤需要手动管理:需显式释放内存。
 

关于栈、堆、静态存储区最大可分配大小的探讨 - Adano1 - 博客园

题。到底栈、堆、静态存储区能申请的最大分配大小是多少呢?

栈(stack)

栈大小与编译器有关。

默认情况下,visual studio 2010 的栈大小为1M。但在平时应用程序中,由于函数会使用栈结果,所以只能用略小于1M大小的栈。
对于64位和32位程序,结果都是一样的,因为VS2010已经设定好了默认的栈大小了

静态存储区(全局变量)

对于全局变量来说,与编译器有关(不保证正确)

默认情况下,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].

总结

总结一下,在默认情况下,栈只能得到1M大小的内存,全局静态储存可以得到2G,而在32位和64位下的堆则可以得到2G和无限内存(一般不会用到16T)。
这里也感慨一下,之前一个项目中要使用SuperLu(一个数学库,用于矩阵分解,分解时无法使用虚拟内存),由于该库本身的一些问题,对于超过60,000左右的顶点数(Vertex),32位的机子就段错误了。而如果使用物理内存为8G的64位机子(64位CPU,64位windows7,编译成64位程序),则可以快速,准确的计算出结果。
因此,在使用大容量内存的程序中,我推荐大家使用 大容量物理内存,大容量虚存的 64位机子,并且编译成64位程序。

在 C/C++ 中,有三种内存分配方式:栈、堆和静态存储区。

c/c++的内存分配,详细说一下栈、堆、静态存储区 - 知乎

你可能感兴趣的:(【C++ 内存管理】静态分配和动态分配)