C++中有五大存储区域
他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区
堆: 存放new出来的变量,编译器在不会去管他的释放。要用我们自己用程序控制,一个new对应一个delete,如果没有释放会在程序结束以后自动释放,这时候就会造成内存泄漏。
栈:在编译器需要时候分配,不需要的时候在自动清理的区域,里面的变量通常是局部变量和函数参数
自由存储区:存放那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的
全局/静态存储区:存储全局变量和静态变量,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域
常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)
堆和栈究竟有什么区别
- 管理方式不同:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak
- 空间大小不同:堆的内存几乎没有什么限制,而栈则有空间大小限制
- 能否产生碎片不同:堆由于经常的new和delete,会很容易产生碎片,从而造成大量的碎片,使程序效率降低。对于栈来讲则不会存在这个问题
- 生长方向不同:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长
- 分配方式不同:堆都是动态分配的,没有静态分配的堆,有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现
- 分配效率不同:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。