关于“最袖珍的垃圾回收器”的实现(C文件)

来源:互联网 发布:软件开发人才缺口 编辑:程序博客网 时间:2024/05/17 04:28

 

/*****************************************************************************
** Notice: Copyright (c) 2007 Some - All Rights Reserved 
**
** create: turui
**
** Date: 2007.12.19
**
** File Name: TRSimpleGc.c
**                                                  
** Revision: 
**
** Description: 
**
** 简单的垃圾回收及管理
**
****************************************************************************
*/

#include 
<stdio.h>
#include 
<malloc.h>
#include 
"TRSimpleGC.h"
 
 
// 定义一些只在本文件中使用的宏
#define HeaderSize (sizeof(void*))
 
// 定义存储数据的数据结构
typedef struct MemBlock _MemBlock;
 
struct MemBlock
{
       _MemBlock
* pPrev;
       
char buffer[BlockSize];
}
;
 
// 定义只在本文件中使用的静态变量,并初始化
static BYTE* m_begin = (BYTE*)HeaderSize;
static BYTE* m_end = (BYTE*)HeaderSize;
 
// 获取链表头
static _MemBlock* const _ChainHeader()
{
       
return (_MemBlock *)(m_begin - HeaderSize);
}

 
void * gc_malloc(UINT32 cb)
{
       
if(cb > (UINT32)((m_end-m_begin)))
       
{
              _MemBlock
* pNowHeader = _ChainHeader();
              
              
// 用来记录用户新申请内存的指针
              
// 也可以叫做内存块,因为包含了一个对这个指针的记录及一个数据存储区域
              _MemBlock* pNewMemBlock = NULL;
 
              
// 这里根据用户用户请求的内存块的大小
              
// 来判断是使用默认块大小还是开辟足够的内存    
              if(cb >= BlockSize) 
              
{
                      pNewMemBlock 
= (_MemBlock*)malloc(HeaderSize + cb);
              }

              
else
              
{
                     
// 这里开辟的内存的大小为_MemBlock
                     
// 即 sizeof(_MemBlock *) + BlockSize
                     
// 也等于 HeaderSize + BlockSize
                     
// 则下面开辟内存也可以换成这句
                     
// _MemBlock* pNew = (_MemBlock*)malloc(HeaderSize + BlockSize);        
                     pNewMemBlock = (_MemBlock*)malloc(sizeof(_MemBlock));
              }

 
              
// 将新内存块的链指针指向之前的内存块
              pNewMemBlock->pPrev = pNowHeader;
 
              
// 重新设置m_begin指针,将 m_begin 指向新内存块的开始
              m_begin = pNewMemBlock->buffer;
 
              
// 将 m_end 指向新内存块的结尾处
              if(cb >= BlockSize)
                     m_end 
= pNewMemBlock->buffer + cb;
              
else
                     m_end 
= pNewMemBlock->buffer + BlockSize;
       }

 
       
// 将 m_end 从后向前移动 cb 个字节
       
// 并将这一段内存交给用户使用
       m_end -= cb;
 
       
return m_end;
}

 
void gc_free()
{
       _MemBlock
* pHeader = _ChainHeader();
       
while (pHeader)
       
{
              _MemBlock
* pTemp = pHeader->pPrev;
              free(pHeader);
              pHeader 
= pTemp;
       }

       m_begin 
= m_end = (char*)HeaderSize;
}