C++做为一款C语言的升级版本,具备很是强大的功能。它不但可以支持各类程序设计风格,并且还具备C语言的全部功能。咱们在这里为你们介绍的是其中一个比较重要的内容,C++内存区域的基本介绍。c++
C++内存区域分为5个区域。分别是堆,栈,自由存储区,全局/静态存储区和常量存储区。程序员
栈:由编译器在须要的时候分配,在不须要的时候自动清除的变量存储区。里面一般是局部变量,函数参数等。算法
堆:由new分配的内存块,他们的释放编译器不去管,由咱们的应用程序去控制,通常一个new对应一个delete。若是程序员没有释放掉,那么在程序结束后,操做系统会自动回收。编程
自由存储区:由malloc等分配的内存块,和堆十分类似,不过它使用free来结束本身的生命。数据结构
全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在之前的c语言中。全局变量又分为初始化的和未初始化的,在c++里面没有这个区分了,他们共同占用同一块内存。函数
常量存储区:这是一块比较特殊的存储区,里面存放的是常量,不容许修改。操作系统
C++内存区域中堆和栈的区别:设计
管理方式不一样:栈是由编译器自动管理,无需咱们手工控制;对于堆来讲,释放由程序员完成,容易产生内存泄漏。指针
空间大小不一样:通常来说,在32为系统下面,堆内存可达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。可是对于栈来说,通常都是有必定空间大小的,例如,在vc6下面,默认的栈大小好像是1M。固然,也能够本身修改:打开工程。 project-->setting-->link,在category中选中output,而后再reserve中设定堆栈的最大值和 commit。htm
可否产生碎片:对于堆来说,频繁的new/delete势必会形成内存空间的不连续,从而形成大量的碎片,使程序效率下降。对于栈来说,则不会存在这个问题。
生长方向不一样:对于堆来说,生长方向是向上的,也就是向着内存地址增长的方向;对于栈来说,它的生长方式是向下的,是向着内存地址减少的方向增加。
分配方式不一样:堆都是动态分配的;栈有静态和动态两种分配方式。静态分配由编译器完成,好比局部变量的分配。动态分配由alloca函数进行、但栈的动态分配和堆是不一样的,它的动态分配由编译器进行释放,无需咱们手工实现。
分配效率不一样:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是c/c++库函数提供的,机制很复杂。库函数会按照必定的算法进行分配。显然,堆的效率比栈要低得多。
进程内存中的映像,主要有代码区,堆(动态存储区,new/delete的动态数据),栈,静态存储区
内存区域地址从低到高的方向:代码区,静态存储区,堆,栈
堆”和“栈”是独立的概念日常说的“堆栈”其实是两个概念:“堆”和“栈”。在英文中,堆是heap,栈是stack,不知道何时,什么缘由,在中文里,这两个不一样的概念硬是被搞在一块儿了,因此,围绕这个混合词所发生的误解和争执这几年就没有断过。 “栈”通常是由硬件(CPU)实现的,CPU用栈来保存调用子程序(函数)时的返回地址,高级语言有时也用它做为局部变量的存储空间。 “堆”是个实实在在的软件概念,使用与否彻底由编程者“显示地(explicitly)”决定,如malloc。 程序通过编译链接生成执行程序后,堆和栈的起始地址就已经肯定了(具体说,是经过“链接程序”),在一个具备反向增加的栈的CPU上,数据空间可表示以下: 低 ->|-----------------| | 全局量(全部已初始化量 .data, | | 未初始化量 .bss ) | 堆起始->|-----------------| | 堆向高地址增加 | | | | | | 自由空间 | | | | | | 栈向低地址增加 | 高 栈起始->|-----------------| 在内存中,“堆”和“栈”共用所有的自由空间,只不过各自的起始地址和增加方向不一样,它们之间并无一个固定的界限,若是在运行时,“堆”和 “栈”增加到发生了相互覆盖时,称为“栈堆冲突”,系统确定垮台。因为开销方面的缘由,各类编译在实现中都没有考虑解决这个问题,只有靠设计者本身解决,好比增长内存等。 ================================================================= 说明(128为例)硬堆栈: 即SP,一般汇编中讲的所谓堆栈(用于PC指针等压栈),通常设置从片内RAM的顶部0X10FF开始向下生长,基本上64个足够足够了 软件堆栈: C编译器自动分配的堆栈,在硬堆栈和全局变量之间的空间,也是向下生长,通常用于局部变量。好比一个子程序定义一个局部变量A[256],那么此空间即在软堆栈中,假设当前软堆栈用到0X800,分派A[256]后,软堆栈用到0X700,A[0]地址为0X700,A[1]地址为 0X701 ……,固然若是局部变量较少,用寄存器就能够了,用不着软堆栈了。此子程序退出后软堆栈恢复到0X800。 另:你的C程序编译后,生成的汇编文件中,R28:R29就是软堆栈指针