ace記憶體分配有兩種方式,分別基於ace_allocator基類和ace_malloc類。
1. 基於ace_allocator的分配方式,
ace提供了多種allocator分配器:
分配器
描述
ace_allocator
ace中的分配器類的介面類。這些類使用繼承和動態繫結來提供靈活性。
ace_new_allocator
通過c++中的new和delete來實現記憶體分配與**。
ace_static_allocator
預分配一大塊記憶體,malloc()時從這塊記憶體中取出。預設記憶體一旦被分配,就再也不會被釋放(在free()介面中不做任何處理)。
ace_cached_allocator
預分配了一塊n×fixed size的記憶體,通過內部的空閒鍊錶來管理分配與**。
ace_dynamic_allocator
與ace_cached_allocator類似,不過多了乙個模板引數,將sizeof(t)作為預分配的fixed size。
在實際應用時,可以通過c++的動態繫結技術實現不同的動態記憶體分配策略,比較靈活,但是帶來的問題就是虛函式的呼叫會帶來額外的開銷。
如果直接呼叫(比方說直接使用ace_dynamic_allocator), 就背離了allocator設計的初衷,缺失了靈活性。不過我覺得在應用場合固定的情況下,直接呼叫也是乙個不錯的方式,可以提高些許效率(特別是對效能要求比較高的地方)。
2. 基於記憶體池的分配方式,
ace提供了多種記憶體池:
池名
描述
ace_mmap_memory_pool
基於mmap的共享記憶體池。
ace_sbrk_memory_pool
基於sbrk的記憶體池。(沒用過,不知道是啥)
ace_shared_memory_pool
基於system v shmipc的共享記憶體池。
ace_pagefile_memory_pool
基於從windows頁面檔案分配的匿名記憶體區記憶體池。
ace_local_memory_pool
基於c++的new和delete的區域性記憶體池。
template
classace_malloc_t;
記憶體池與鎖作為分配器類的模板引數,提供了外部多型性。
template
classace_allocator_adapter: public ace_allocator;
為不同的分配器類提供乙個介面卡方法。
使用時一般是下面這種呼叫方式:
typedef ace_mallocmutex_malloc;
typedeface_allocator_adaptermutex_allocator;
《ace中文文件》上說ace_malloc_t在編譯時,通過它的模板引數進行配置,相對比於ace_allocator使用虛函式來實現多型,效能要更好一些。但是這裡完全沒有考慮到鎖的開銷?
3. 分析與總結
在我看來,如果不涉及程序間的通訊,allocator就足夠解決問題了,雖然由於c++虛函式的呼叫帶來了一些效能損耗,但是這點完全是可以接受的。
如果涉及到程序間通訊,由於有鎖的存在,記憶體池也不見得就是乙個高效的實現。至少在linux下,程序間通訊完全可以通過無鎖的雙共享記憶體佇列來實現。
記憶體管理機制
記憶體管理 jvm將記憶體分成三大主要區域 堆,棧,方法區,用來儲存資料。堆 堆中主要儲存引用型別物件,給成員變數分配空間。棧 jvm在執行程式時,在棧中會為每乙個方法都提供儲存空間叫棧幀,用來儲存方法中的區域性變數。方法區 用來儲存jvm載入的位元組碼檔案的資訊 類的資訊 包含類的方法,方法只有乙...
記憶體管理機制
記憶體管理是乙個作業系統必不可少 並且 非常重要的一環 linux 的成功 和它優秀的記憶體管理聯絡非常密切 因為乙個系統的高效性慾穩定性往往決定於它的記憶體管理機制 我項很多人吃過 dos 下 640k 的苦吧 前面我們介紹了 386 保護模式 從今天起我們將在此基礎上 分析 linux 的虛擬儲...
ios中的記憶體管理機制
ios記憶體管理的精髓就是引用計數,那麼為什麼要使用引用計數呢?其實oc語言中,操作的都是指標物件,沒有物件變數的概念 c 中既有物件,也有指標,比如class a,a a或者a pa 這樣的話,指標的管理就是一大問題 分配 釋放 在c 中,對記憶體的管理,除了程式設計師自身的經驗外,另外也有一些管...