动态对象创建(一)

 对于C++程序的设计和编写,内存的申请和释放直接印象到程序的性能和稳定性,在这里总结下自己最近对C++动态对象创建的理解;

1.内存分配方式:

    动态对象的创建,要理解它们的工作机制,就必须先了解操作系统的内存分配方式。在操作系统中,内存的分配方式主要有以下的三种方式:

    a. 静态存储区域分配:
         内存在编译的时候或者在操作系统初始化的时候就进行分配,这块内存的生命周期在于程序的整个运行期间,大小不变,不会重新进行内存分配。
         例如:全局变量、静态变量static的内存分配

    b. 栈上的内存分配:
          栈是系统的数据结构,它的分配方式有系统来进行维护,不需要开发者来管理;
          例如: 局部变量,在其作用域范围内由系统控制局部变量在栈上的创建和销毁.
    c. 堆上的内存分配:
          也就是本文要讨论的动态对象创建,堆内存上的分配是在程序运行期间有开发者控制创建的,使用的好坏直接决定程序的性能和稳定。
          例如:Malloc()/Free()   C语言标准库函数,在C语言中负责动态内存的分配,new/delete C++中用来动态创建对象(动态内存分配和删除)

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()的实现方式在操作系统中实现不同,这里就不多做说明.暂时做到会用即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值