memory

对于应用程序而言,内存中存储区域大致有堆、栈、静态区域三个部分。系统在分配内存的时候,会在内存中寻找一个能够满足申请大小的区域进行标记,并返回此区域的大小。


在应用程序运行时,系统为应用程序分配的只是虚拟的地址空间,并不是实际的物理存储器。这就需要给进程预定的区域(地址空间)调拨物理存储器(内存),来存放相关的数据。但是通过CPU来进行操作,也可以将磁盘早上的页交换文件作为内存的一部分。通过页交换文件使得内存增加,但是同时将消耗大量CPU资源。


如果多个进程共享一个内存映射文件,在修改文件内容时,系统会产生一个新视图,来复制当前文件中的内容,也就是说,修改的其实是复制视图的内容,修改完毕后,系统将新视图的内容更新到源文件中,此时所有共享此内存的进程全部会看到修改的内容。


 


堆:对于应用程序而言,是一块由系统为应用程序而分配的内存区域。一个进程默认的有一个默认堆区域,程序中所有的内存申请,全部来自此区域。如:new/malloc申请的内存。在进程结束后,默认堆空间释放。应用程序对堆的访问原则上是顺序的,如3个线程同时访问堆,必须进行排队。程序猿也可以不使用进程默认的堆,进行自己创建一个堆。将 new操作符重载即可使用自己创建的堆空间。但是delete操作符也必须重载。


 


栈:一个进程中,默认的也会有一个栈区域,但是栈是由系统编译器进行分配和销毁。栈的存在是因为进程中的主线程,在线程中(程序中)声明的局部变量全部都在栈上。进程中的每一个线程都对应有一个线程栈,进行存储线程中的局部变量。由系统进行回收。


 


静态区域:程序中所有的静态或者全局变量都存储在此区域,在进程结束后,由系统进行回收。


 


顺便提一下new和malloc.个人觉得要说两者区别无非两点:


1、  new是操作符,在申请内存的时候,编译器会调用构造函数自动对申请的区域进行初始化。Malloc是个函数,只会申请内存不会进行初始化。


2、  new申请的时候,必须指定类型,成功后会返回指定类型的指针。指针指向分配的内存地址。Malloc 申请的时候,如果不强制指定类型,返回一个void *的指针。也就是说申请的内存区域可以存放任何类型的数据。


两者都是在堆上进行申请。New申请的对象在释放后,应该讲此对象的指针指向NULL,而不是不处理。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章