(一)内存分区
在C++中,内存分成5个去,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区
栈:就是那些由编译器在需要的时候分配的,在不需要的时候自动清除的变量的存储区。也就是说那些静态存储分配的局部变量都在这里。
堆:动态存储分配的,由new/malloc分配的内存块,它们的释放编译器不去管,而是由应用程序去控制,一般一个new/malloc就要对应一个delete/free。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
全局/静态存储区:全局变量和静态变量被分到同一块内存中。
常量存储区:这是一块比较特殊的存储区,它们里面存放的是常量,不允许修改。如果非要修改在C++中也可以利用const进行修改。
(二)堆和栈的区别
分配方式不同:栈内存是由编译器负责分配和释放的。堆的释放工作是由程序员来控制的,容易忽略。
空间大小不同:栈,一般都是有一定的空间大小。堆内存几乎是不受限制的。
碎片的产生:堆,频繁的new/delete, malloc/free势必会造成内存空间的不连续,造成大量的碎片空间,程序效率降低。栈,不会存在这个问题,栈是先进后出的队列,所以永远不可能在内存块中间出现碎片。
分配方式不同:堆是动态分配的,没有静态分配的堆。栈有两种分配方式:静态和动态,静态分配时编译器自己完成的(局部变量)动态分配是由alloca函数进行分配。
分配效率不同:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持。堆是C++函数库提供的,机制比较复杂,所以栈的分配效率比堆的效率高, 由于堆是动态分配,在分配内存后,OS要负责将VA映射到物理内存, 效率没有静态分配的栈高。