struct class和STL的統一記憶體管理

2021-05-25 12:23:24 字數 2428 閱讀 4327

利用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 結構體 結構體就是乙個可以包含不同資料型別的乙個結構,它是一種可以自己定義的資料型別,它的特點和陣列主要有兩點不同,首先結構體可以在乙個結構中宣告不同的資料型別。第二,相同結構的結構體變數是可以相互賦值的,而陣列是做不到的,因為陣列是單一資料型別的資料集合,它本身不是資料型別 而結構體是 陣列名...