利用c++的new和delete操作符過載特性,可以對自定義的struct和class進行統一記憶體管理,再加上stl allocator的開放特性,便可以將stl容器物件的記憶體管理併入struct和class的記憶體管理,進而將這三者的記憶體管理統一。
首先實現自定義的記憶體管理演算法框架,開放介面為allocate和deallocate,實現庫為memmgr.dll
class memory_manager
public:
virtual void* allocate(size_t size) = 0;
virtual void deallocate(void* ptr, size_t size) = 0;
通過顯示載入或隱式鏈結得到memmgr.dll匯出的自定義記憶體管理框架介面指標
memory_manager* ptrmemmgr;
針對struct和class,建立公共基類,並呼叫匯出的記憶體管理相關介面
class basic_object
public:
void* operator new(size_t size)
return (ptrmemmgr->allocate(size);
void operator delete(void* ptr, size_t size);
ptrmemmgr->deallocate(ptr, size);
自此,對於任意的自定義struct和class,都可以公共繼承自basic_object,呼叫new和delete時便會呼叫basic_object::new和basic_object::delete介面,如下示例
class example : public basic_object
public:
// 這裡省略成員函式和成員變數的宣告和實現,就像沒有繼承自basic_object時一樣
當對example進行new和delete操作時,編譯器將產生呼叫basic_object::new和basic_object::delete的**
至此,已將struct和class的記憶體管理統一了
對於stl,由於stl的所有容器都有乙個allocator的模板引數,因此我們需要自定義allocator
template
class newallocator : public std::allocator
public:
template
struct rebind
typedef newallocatorother;
template
newallocator(newallocatorconst&) throw()
template
newallocator& operator=(newallocatorconst&) throw()
return (*this);
t* allocate(size_type count)
return (basic_object::operator new(count * sizeof(t));
void deallocate(t* ptr, size_type count)
basic_object::operator delete(ptr, count * sizeof(t));
然後,對於任何容器,只需使用上面自定義的newallocator即可,如
std::vector> vtexample;
std::map, newallocator>> mapexample;
至此,stl容器的記憶體管理也併入memory_manager裡了,三者的記憶體管理達成統一。
注意:
(1)由於這裡只過載了operator new和operator delete,因此只為struct和class的單個物件有效,對於陣列仍會使用全域性的::operator new和::operator dlete。當然也可以過載operator new和operator delete操作符,這樣便將陣列的記憶體管理也併入memory_manager裡了。
(2)使用自定義的記憶體管理框架後,對於struct,由於有了成員函式,便不能使用宣告時初始化陣列的方式,如
struct stu stuexample = ; // 這種使用方式將導致編譯錯誤,但可以使用memset(&stuexample, 0, sizeof(stu))
(3)可以為operator new(或者new)加入更多的引數,如檔名和行數,進行debug下的記憶體洩漏檢測
(4)過載operator delete時,應該使用operator delete(void* ptr),否則使用operator delete(void* ptr, size_t size)時傳入的引數size只是乙個物件的大小,而不是整個陣列的大小
(5)如果自定義實現的記憶體管理框架中可以保證不產生異常,對於basic_object和newallocator可以使用throw()進行優化
struct class 和union記憶體對齊
基本資料型別所佔空間 unsigned無符號型別相同 大小足夠容納最寬的成員 大小能被其包含的所有基本資料型別的大小所整除。是被資料型別的大小 1,2,4,8,不是變數大小 方法 記憶體大小只取決於最大的成員 找到佔空間最大的成員,取最大的空間值x 當x無法被所有的資料型別大小所整除,就補加a,使得...
C和C 中struct,class問題
在c c 中,struct結構體還是有所差別的,c中沒有class,c 中struct和class的區別就只有預設訪問許可權,預設繼承許可權.1.c 中,class和struct的區別 1.成員訪問許可權 class的成員訪問許可權為private,而struct的成員訪問許可權為public 2....
struct class的c 結構體
c 結構體 結構體就是乙個可以包含不同資料型別的乙個結構,它是一種可以自己定義的資料型別,它的特點和陣列主要有兩點不同,首先結構體可以在乙個結構中宣告不同的資料型別。第二,相同結構的結構體變數是可以相互賦值的,而陣列是做不到的,因為陣列是單一資料型別的資料集合,它本身不是資料型別 而結構體是 陣列名...