c語言標準庫malloc函式的效率是很低的,一般在嵌入式裝置上是比較要求效率,所以在嵌入式小型系統中,可以開闢乙個大一點的陣列,通過管理該陣列模擬記憶體釋放的功能,以此來提高記憶體申請和釋放的效率。
/*
* malloc.h
* * created on: 2023年11月26日
* author: ankun
*/#ifndef malloc_h_
#define malloc_h_
#ifndef null
#define null 0
#endif
#define mem_block_size 32
// 記憶體塊大小
#define mem_block_nums 1024
// 記憶體塊數目
#define mem_max_size (mem_block_size * mem_block_nums)
// 記憶體池大小,32*1024=32kb
// 記憶體池初始化
void
mem_init
(void);
// 記憶體釋放
void
mem_free
(void
* p)
;// 記憶體申請
void
*mem_malloc
(unsigned
int size)
;// 重新調整已有記憶體大小
void
*mem_realloc
(void
* p,
unsigned
int size)
;// 獲得記憶體使用率
float
mem_perused
(void);
// 記憶體設定
void
mem_memset
(void
* dst,
unsigned
char val,
unsigned
int size)
;// 記憶體拷貝
void
mem_memcpy
(void
* dst,
const
void
* src,
unsigned
int size)
;// 獲得記憶體使用量
unsigned
intmem_getused
(void);
// 獲得記憶體空餘量
unsigned
intmem_getfree
(void);
// 獲得記憶體大小
unsigned
intmem_getsize
(void);
#endif
/* malloc_h_ */
/*
* malloc.c
* * created on: 2023年11月26日
* author: ankun
*/#include
"malloc.h"
__attribute__((
aligned(4
)))unsigned
char memory[mem_max_size]
;__attribute__((
aligned(4
)))unsigned
short memtbl[mem_block_nums]
;/**
* 記憶體拷貝函式
* @param dst 目標位址
* @param src 源位址
* @param size 拷貝大小
*/void
mem_memcpy
(void
* dst,
const
void
* src,
unsigned
int size)
while
(size--)}
/** * 記憶體設定函式
* @param dst 目標位址
* @param val 要設定的值
* @param size 記憶體連續設定的長度
*/void
mem_memset
(void
* dst,
unsigned
char val,
unsigned
int size)
while
(size--)}
/** * 記憶體申請函式,申請的記憶體空間會被初始化為0
* @param size 要申請的大小
* @return 申請成功返回記憶體位址,失敗返回null
*/void
*mem_malloc
(unsigned
int size)
p =(unsigned
char*)
(memory +
(i +
1- nblocks)
* mem_block_size)
;mem_memset
(p,0
, nblocks * mem_block_size)
;return
(void
*)p;}}
return
null;}
/** * 重新申請記憶體
* 注意:若newsize > p的size,則會造成p的多餘部分內容丟失;若p為空位址,則等效於mem_malloc函式
* @param p 舊位址
* @param size 重新申請的大小
* @return 新位址
*/void
*mem_realloc
(void
* p,
unsigned
int newsize)
return
null;}
/** * 記憶體釋放函式
* @param p 要釋放的記憶體位址
*/void
mem_free
(void
* p)
}/**
* 獲得記憶體使用率
*/float
mem_perused
(void
)return((
(float
)(used *
100))/
((float
)mem_block_nums));
}/**
* 獲得記憶體使用量
*/unsigned
intmem_getused
(void
)return used * mem_block_size;
}/**
* 獲得記憶體空餘量
*/unsigned
intmem_getfree
(void
)return free * mem_block_size;
}/**
* 獲得記憶體池總大小
*/unsigned
intmem_getsize
(void
)/**
* 記憶體池初始化函式
*/void
mem_init
(void
)
C語言實現記憶體池
什麼是記憶體池,這裡簡單介紹一下 不做詳細說明 記憶體池技術是一種用於分配大量大小相同的小物件的技術,通過該技術可以極大加快記憶體分配 釋放過 程。其原理是先申請一大塊記憶體,然後分成若干個大小相等的小塊,用鍊錶的方式將這些小塊鏈在一起,當開發人員需要使用記憶體時 分配 從煉表頭取下一塊返 回給開發...
C語言記憶體管理(記憶體池)
c語言可以使用 alloc 從棧上動態分配記憶體。malloc free或者 new delete 大量使用會造成記憶體碎片,這種碎片形成的機理如下 記憶體碎片一般是由於空閒的記憶體空間比要連續申請的空間小,導致這些小記憶體塊不能被充分的利用,舉個例子 如果有100 個單位的連續空閒記憶體,那麼先申...
c語言實現執行緒池
ifndef threadpool h included define threadpool h included include typedef struct threadpool job void routine void void arg struct threadpool job next ...