关于“最袖珍的垃圾回收器”的实现(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;
}
** 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;
}
- 关于“最袖珍的垃圾回收器”的实现(C文件)
- 关于“最袖珍的垃圾回收器”的实现(头文件)
- 关于“最袖珍的垃圾回收器”的实现(序)
- 关于“最袖珍的垃圾回收器”的实现(使用)
- 关于“最袖珍的垃圾回收器”的实现(分析)
- 最袖珍的垃圾回收器
- C++内存管理变革(2):最袖珍的垃圾回收器
- C++内存管理变革(2):最袖珍的垃圾回收器
- C++内存管理变革(2):最袖珍的垃圾回收器
- C++内存管理变革(2):最袖珍的垃圾回收器
- C++内存管理变革(2):最袖珍的垃圾回收器
- C++内存管理变革(2):最袖珍的垃圾回收器
- C++内存管理变革(2):最袖珍的垃圾回收器
- 垃圾回收器的实现
- C + +的袖珍参考
- 关于垃圾回收器的剖析
- 关于lua垃圾回收器的理解
- 关于垃圾回收的总结
- 关于“最袖珍的垃圾回收器”的实现(头文件)
- 关于驱动程序中的ioctl
- autorun.inf完全操作手册
- C#的6种常用集合类
- 浏览目录对话框
- 关于“最袖珍的垃圾回收器”的实现(C文件)
- 补充点内容
- Nhibernate 学习笔记(1)
- 抽象工厂(Abstract Factory)
- VS2005 安装程序制作 4 最小化oracle客户端的安装
- 使用脑图记录方式代替
- 字节对齐
- ASP .NET - 数据库连接
- 转: Design Patterns