boost的pool記憶體池

2021-07-11 06:29:14 字數 2793 閱讀 8609

參考《boost程式庫開發完全指南》

//pool_func_eg.h

#pragma once

#include#includeusing namespace boost;

void eg();

void eg_object_pool();

void eg_construct();

void eg_singleton_pool();

//object_pool.coo

#include"pool_func_eg.h"

/* object_pool的特殊之處是construct和destroy函式,這兩個函式是object_pool的真正價值所在。

construct先呼叫malloc分配記憶體,然後再在記憶體塊上使用傳入的引數呼叫類的建構函式,返回的是乙個已經初始化的物件指標(類似於make_shared)

destroy則先呼叫物件的析構函式,然後再用free釋放記憶體塊

*/#includestruct demo_class

};void eg_object_pool()

} //所有物件都在這裡被析構釋放

/* construct預設最多只能使用3個引數建立物件,但constructor被設計為可擴充套件的

pool庫在目錄boost/pool/detail下提供了乙個名為pool_construct.m4和pool_construct_******.m4的指令碼

並同時提供可在unix/linux和windows下執行的同名sh和bat可執行指令碼檔案,只要簡單的向批處理指令碼傳遞乙個整數引數n,

m4就能自動生成具有n個引數的construct原始碼

*//*

自定義擴充套件construct,若臨時的想要擴充套件引數的數量,可以自定義乙個construct函式

下面**模仿construct函式實現了乙個可接受4個引數的建立函式

*/struct demo_class1

};templateinline typename p::element_type * construct(p &p, const t0 & a0, const t1 & a1, const t2& a2, const t3& a3)

void eg_construct()

//singleton_pool.cpp

#include"pool_func_eg.h"

/* singleton_pool與pool的介面完全一致,可以分配簡單資料型別的記憶體指標,但它是乙個單件,並提供執行緒安全

*/#include/*

singleton_pool的成員函式均是靜態的,因此不會產生single_ton的例項,呼叫函式的時候直接用域操作符

所以它的生命週期與整個程式一樣長,除非手動呼叫release_memory或purge_memory,否則singleton_pool不會自動釋放占用的記憶體

*/struct pool_tag{}; //空類,僅僅用於標記

typedef singleton_poolsp; //記憶體池定義

void eg_singleton_pool()

//用來測試各個cpp中的函式

/*

pool庫基於簡單的分隔儲存思想實現了乙個簡單的記憶體池庫,不僅能夠管理大量的物件,還可以用作stl的記憶體分配器

pool庫包含4個部分:最簡單的pool,分配類例項的object_pool,單件記憶體池singleton_pool,可用於標準庫的pool_alloc

*/#include"pool_func_eg.h"

/* pool的模板型別引數userallocator是乙個使用者定義的記憶體分配器,它實現了特定的記憶體分配演算法,通常

可以直接用預設的default_user_allocator_new_delete

pool的建構函式接受乙個size_type型別的整數request_size只是每次pool分配記憶體塊的大小(不是記憶體池的大小)

在析構時,pool將自動釋放記憶體

成員函式malloc和ordered_malloc的行為更類似於c中的全域性函式malloc,void*指標返回從記憶體池中分配的記憶體塊

大小為建構函式中指定的requested_size如果分配失敗,函式返回0,不會丟擲異常

malloc從記憶體池中任意分配乙個記憶體塊,order_malloc則在分配的同時合併空閒塊鍊錶。

order_malloc帶引數的形式還可以連續分配n快的記憶體,分配後的記憶體塊可以用is_from函式測試是否是從這個記憶體池分配出去的

與malloc對應的函式是free,用來手工釋放之前分配的記憶體塊,這些記憶體塊必須是從這個記憶體池分配出去的

一般情況下記憶體池會自動管理記憶體分配,不應該呼叫free函式,除非你認為記憶體池的空間已經不足,必須釋放已經分配的記憶體

還有兩個成員函式release_memory讓記憶體池釋放所有未被分配的記憶體,已分配的記憶體不受影響

purge_memory則強制釋放記憶體池持有的所有記憶體,這兩個函式一般情況下也不應該手工呼叫

*///example for pool

//pool只能用於int double 等型別的記憶體池

void eg_pool()

} //記憶體池物件析構,所有分配的內存在這裡都被釋放

int main()

關於boost庫里的記憶體池pool

記憶體池是一種可以提高程式效率的一種途徑,記憶體是提高的地方就是一次申請一塊較大的記憶體,在你後面使用的時候就直接在申請好的記憶體中申請使用即可,省去了每次單獨申請空間時間。也避免了記憶體碎片,當申請的記憶體足夠大,在使用的時候函式中申請記憶體遲裡的記憶體時候,如果申請的空間牛才能沒有用完,剩下的記...

boost 記憶體池

1.什麼是記憶體池 池 是在計算機技術中經常使用的一種設計模式,其內涵在於 將程式中需要經常使用的核心資源先申請出來,放到乙個池內,由程式自己管理,這樣可以提高資源的使用效率,也可以保證本程式占有的資源數量。經常使用的池技術包括記憶體池 執行緒池和連線池等,其中尤以記憶體池和執行緒池使用最多。記憶體...

測試boost記憶體池

最近測試了一下boost執行緒池,向大家公布一下測試結果,本測試在單執行緒環境下進行,boost pool實用單執行緒記憶體方法 boost singleton pool適用多執行緒記憶體訪問 測試 如下 struct student void heapallocate for int j 0 j ...