内存分区:
1:栈 在需要的时候,由编译器分配,在不需要的时候,自动清除.通常认为 EBP和局部变量,函数的调用,函数调用过程中的参数,返回地址,都采用栈的方式存放.不够灵活随意(比如大小).
2:堆 使用new分配,应用程序控制,一个new对应一个delete,如果程序员没有释放掉,操作系统自动回收,足够灵活随意.
3:自由存储区 由malloc等函数分配,由free释放,和堆极其相似.
4:全局/静态存储区.
5:常量存储区.
🌰简单解释一下这句代码: int* p=new int[10];
p放在栈上, int数组放在堆上,p存放的是int数组的首地址,指针p也有首地址,这2个首地址不能混淆.
堆和栈的主要区别:
1:管理方式,栈由编译器自动管理,堆由程序员管理时,容易产生内存泄露
2:可分配空间的大小:在32位系统下,堆内存可以达到4G的空间(但一般不会达到,在某一临界点操作系统会直接杀死程序),栈空间大小约1M具体数值在不同平台下会有不同.程序员操作堆,会频繁的进行new/delete,会产生内存碎片,不易管理,效率较低.栈是先进后出的队列,不会有从中间突然断裂出一块内存(这就是内存碎片),效率较高.
3:生长方向,在不同机器下也有不同,debug和release也有不同.一般情况下,对于堆是向上的,对于栈是向下的
4:分配方式:堆是由动态分配的,不存在静态分配.栈可以用静态和动态方式分配
5:分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高.堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。