对于C++程序的设计和编写,内存的申请和释放直接印象到程序的性能和稳定性,在这里总结下自己最近对C++动态对象创建的理解;
1.内存分配方式:
动态对象的创建,要理解它们的工作机制,就必须先了解操作系统的内存分配方式。在操作系统中,内存的分配方式主要有以下的三种方式:
a. 静态存储区域分配:
内存在编译的时候或者在操作系统初始化的时候就进行分配,这块内存的生命周期在于程序的整个运行期间,大小不变,不会重新进行内存分配。
例如:全局变量、静态变量static的内存分配
栈是系统的数据结构,它的分配方式有系统来进行维护,不需要开发者来管理;
也就是本文要讨论的动态对象创建,堆内存上的分配是在程序运行期间有开发者控制创建的,使用的好坏直接决定程序的性能和稳定。
2.动态内存分配和虚拟内存
动态内存分配在不同的操作系统中实现方式有所不同,对于支持虚拟内存的操作系统,动态内存分配和删除在虚拟内存中进行;而一些嵌入式操作系统并不支持虚拟内存,这样动态内存的分配直接在物理内存上进行;虚拟内存的分配主要包括:(在一些博文中提到如下几点的分配方式:详细细节可自己考证)
a. 进程使用的内存地址是虚拟的(每个进程感觉自己拥有所有的内存资源),需要经过页表的映射才能最终指向系统实际的物理地址。
b. 主内存和磁盘采用页交换的方式加载进程和相关数据,而且数据何时加载到主内存,何时缓存到磁盘是OS调度的,对应用程序是透明的。
c. 虚拟存储器给用户程序提供了一个基于页面的内存大小,在32位系统中,用户可以页面大小为单位,分配到最大可以到4G(内核要使用1G或2G等内存地址)字节的虚拟内存。
d. 对于虚拟内存的分配,操作系统一般先分配出应用要求大小的虚拟内存,只有当应用实际使用时,才会调用相应的操作系统接口,为此应用程序分配大小以页面为单位的实际物理内存。
e. 不是所有计算机系统都有虚拟内存机制,一般在有MMU硬件支持的系统中才有虚拟内存的实现。许多嵌入式操作系统中是没有虚拟内存机制的,程序的动态分配实际是直接针对物理内存进行操作的。许多典型的实时嵌入式系统如Vxworks、Uc/OS 等就是这样。
3. 动态对象的创建
动态对象创建基本实现过程:
确定内存大小 --- 初始化内存 ---- 内存地址返回
频繁的进行动态内存分配会造成内存碎片的产生,影响系统的性能和稳定,所以在不同的系统中,对于动态内存管理,有着不同的实现算法;(可参考资料:Glib的源代码、内存管理书籍)不同的操作系统有不同的实现方式,为了程序的可移植性,一般开发语言都提供了统一的接口,对于C语言中,在标准C库和Glib中,都实现了以malloc/free为接口的动态内存分配功能,所以说malloc/free对不同的操作系统有不同的实现方式。
一般C 库中的malloc/free函数会实现应用层面的内存管理算法,在系统真正需要内存时,才通过操作系统的API(系统调用)来获取实际的物理内存,当然,你也可以使用第三方的内存管理器,或者通过自己改写malloc/free函数来实现应用层面的内存管理。
malloc()/free()的基本形式:
void* malloc( size_t size );
void* calloc(size_t nmemb, size_t size);
void free(void *ptr);
void* realloc(void *ptr, size_t size);
malloc()/free()的实现方式在操作系统中实现不同,这里就不多做说明.暂时做到会用即可。