堆栈
堆是应用程序在运行的时候让操作 系统给自己分配的内存,C/C++分别用malloc/New请求分配Heap,用free/delete销毁内存。由于从操作系统管理的内存分配所以在分配和销毁时都要占用时间,所以用堆的效率低的多!但是堆的好处是可以做的很大,C/C++对分配的Heap是不初始化的。
堆的相关特性:
1.堆是由操作系统管理的一片空间,事先是没有在进程空间里分配的(比如你在没有分配堆的时候就访问堆空间会报一个内存访问错误),一般是由程序动态的分配出来,一旦分配了以后,一般需要程序去释放自己的堆空间。
2.堆的空间较大,但访问速度没有栈
3.堆受垃圾处理器GC管理(GC会去找那些很久没有引用地址指向的内存块,把它们清理掉)。
栈:是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FILO的特性,在编译的时候可以指定需要的Stack的大小。
栈的相关特性:
1.栈上是向下填充的,数据只能从栈的顶端插入和删除(先进后出原则)。把数据放入栈顶称为入栈(push),从栈顶删除数据称为出栈(pop)。
2.栈的空间较小,但访问速度快。
3.栈的生长方向是有高地址向低地址生长的。
4.栈的清理是由系统自动完成的。
堆栈的区别:
系统会自动的在栈上为其开辟空间。而堆则是程序员根据需要自己申请的空间,例如malloc(10); 开辟十个字节的空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。
堆不分先进后出还是先进先出,堆没有任何访问限制,它就像是你的书架,所有的书都排列在书架上,当你想看某一本书的时候,可以随时找到一本我们需要的书,从书架上把它拿下来。