1. 程式人生 > >C/C++內存管理器

C/C++內存管理器

++ 常見 挖坑 內存 ria 管理 c++標準庫 multi devel

C標準庫提供了malloc,free,calloc,realloc,C++標準庫還提供了new, new[], delete, delete[]。這些用來管理內存,看起來夠用了,為啥還要自己寫一個內存管理器呢?

原因還是從性能考慮:例如malloc和new是出於通用性考慮的,能處理多線程情況(multithread)。對於單線程的程序,這種額外的功能反而降低性能。
而且還註意到,new/delete/free/malloc都是要在user-space和kernel-code做切換的,context的切換會降低性能。如果自己寫一個user-land的內存管理器,就能大幅減少這種切換。還有就是GC(garbage collection)。

幾點要求

  1. 速度:比編譯器的內存分配器要快才行
  2. 魯棒:不能有內存泄漏,分配多少就收回多少
  3. 方便:用戶不怎麽需要改代碼,就能把內存管理器加進去
  4. 移植:應當跨平臺,用戶在啥系統上都能用,方便移植

前人經驗

  1. 申請大塊內存
    一次性申請一大塊內存,減少向系統申請的次數,以後需要申請內存就從這一大塊上分配。
    (這不就是緩存麽。。)
  2. 為特定尺寸優化
    任何程序中都一種最常見的內存申請尺寸。為這種尺寸優化,提升性能。
  3. 需要刪除的內存暫時存放在容器中(敝帚自珍)
    從用戶角度看,變量聲明周期結束,要釋放分配的內存;但是內存管理器實際上可以“不真的把這塊內存還給系統”,而是攢起來留給後續需要分配內存時用。當然,這種內存更多的是碎片,所以再分配時可能不夠用,那就得再找大塊內存去分配了。

以上內容來自IBM的一篇教程,還有很多內容沒能看完和理解,挖坑帶填:https://www.ibm.com/developerworks/aix/tutorials/au-memorymanager/index.html

C/C++內存管理器