参考:https://blog.csdn.net/weixin_50901683/article/details/113774484
一、内存分为四个区:代码区、全局区、栈区、堆区
程序运行前:在程序编译后,生成exe可执行程序,未执行程序前分为两个区域:代码取、全局区
代码区:存放函数体的二进制代码
全局区:这块内存在程序的整个运行期间都会存在,全局区上的数据在程序结束后由系统释放(不是函数结束后释放)
1,全局变量
2,静态变量:static关键字
3,常量区:字符串常量 + const修饰的全局常量(局部常量不在全局区)
程序运行后:
栈区(stack):
1,由编译器自动分配和释放,在函数执行完后自动释放。从高地址向低地址增长
2,存放的是运行时函数分配的局部变量,函数参数,返回数据,返回地址等参数
3,不要返回局部变量的地址,栈区开辟的数据如果再去操作这个内存,但这个内存已经不属于你了
4,效率高,但是分配的内存容量有限
堆区(heap):
1,由程序员手动分配和释放。若程序员不释放,则程序结束是由os回收。从低地址向高地址增长
2,容量大于栈,程序中动态分配的内存在此区域。
3,c++中主要用new开辟内存,释放用delete
4,内存泄漏、内存碎片
二、内存分区的意义:
不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程
三、堆和栈的区别
1,管理方式不同:栈由编译器自动申请和释放空间,堆需要程序员手动申请和释放空间。
2,空间大小不同:栈的空间有限,32位平台下,VC6下默认为1M,而堆最大可以达到4G。
3,能否产生碎片
4,生长方向的不同:堆的生长方向是向上的,也就是向着内存地址增加的方向,而栈刚好是相反的,栈是向着内存减小的方向生长的(因为栈的空间十分有限,所以栈是从上限往栈的下限生长的)
5,分配的方式不同:堆都是动态分配的,没有静态能进行分配的堆。而栈有静态分配和动态分配两种分配方式。
静态分配是编译器完成的,比如局部变量的分配,动态分配在C++中由new函数进行分配。请注意:栈的动态分配和堆的是不同的,栈的动态分配由编译器进行释放,无需使用delete进行释放。
alloca()函数作用:这个函数的作用是可以从栈里动态分配内存
6,分配的效率不同:栈的效率比堆要高很多