`
sunny.yang
  • 浏览: 31720 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

转 简单c++ 内存池

阅读更多

经典的内存池(mempool)技术,是一种用于分配大量大小相同的小对象的技术。通过该技术可以极大加快内存分配/释放过程。

内存池只涉及两个静态常量:Block_Size(mempool的容量大小)、Item_Size(小对象的大小,但不能小于指针的大小,在32位平台也就是不能小于4字节),以及两个指针变量BlockNodeHead、FreeItemNodeHead。开始,这两个指针均为空。

其中指针变量BlockNodeHead是把所有申请的内存块(Block_Node)串成一个链表,以便通过它可以释放所有申请的内存。FreeItemNodeHead变量则是把所有自由内存结点(Item_Node)串成一个链。

详细信息请查看http://www.itgrass.com/a/cjj/C-jc/200706/29-9836.html

下面给出完整实例代码:

/*
 *
 * Filename: mempool.h
 *
 * Description: 
 *
 * Version: 1.0
 * Created: 03/31/2010 11:03:23 AM
 * Revision: None
 * Compiler:  gcc(g+)
 *
 * Author: Zhenghe Zhang (Programmer), 406550785@qq.com
 * Company: XX.CO.,LTD
 *
 */

#ifndef _MEMPOOL_H
#define _MEMPOOL_H

class Mempool
{
          public:
                   Mempool();
                   ~Mempool();

                   void* Alloc();
                   void Free(void* p);

          private:
                   const static int Block_Size = 1024;
                   const static int Item_Size = 16;

 

                   struct Item_Node
                   {
                               struct Item_Node *next;
                               char data[Item_Size - sizeof(Item_Node*)];
                   };

                   struct Block_Node
                   {
                               struct Block_Node *next;
                               Item_Node data[Block_Size / Item_Size];
                   };

                   Block_Node* BlockNodeHead;
                   Item_Node* freeItemNodeHead;
};
#endif

/*
 *
 * Filename: mempool.cpp
 *
 * Description: 
 *
 * Version: 1.0
 * Created: 03/31/2010 01:43:20 PM
 * Revision: None
 * Compiler: gcc(g++)
 *
 * Author: Zhenghe Zhang (Programmer), 406550785@qq.com
 * Company: XX.CO.,LTD
 *
 */

#include <iostream>
#include "mempool.h"
using namespace std;

Mempool::Mempool():BlockNodeHead(NULL),freeItemNodeHead(NULL)
{
}

Mempool::~Mempool()
{
         Block_Node* tmp = BlockNodeHead;
         while(tmp != NULL)
         {
                 BlockNodeHead = BlockNodeHead->next;
                 delete tmp;
                 tmp = BlockNodeHead;
         } 
}

void* Mempool::Alloc()
{
         if(freeItemNodeHead == NULL)
         {
                 Block_Node* tmpBlockNode = new Block_Node;
                 if(tmpBlockNode == NULL)
                 {
                             perror("No memory!\n");
                             exit(1);
                 }

 

                 if(BlockNodeHead == NULL)
                 {
                             BlockNodeHead = tmpBlockNode;
                             BlockNodeHead->next = NULL;
                 }
                 else
                 {
                             tmpBlockNode->next = BlockNodeHead;
                             BlockNodeHead = tmpBlockNode;
                 }

                 freeItemNodeHead = &(tmpBlockNode->data[0]);

                 int i = 0;
                 while(i < Block_Size/Item_Size - 1)
                 {
                             tmpBlockNode->data[i].next = &(tmpBlockNode->data[i + 1]);
                             ++i;
                  }
                  tmpBlockNode->data[i].next = NULL;
        }

        Item_Node* allocItemNode = freeItemNodeHead;
        freeItemNodeHead = freeItemNodeHead->next;

        return allocItemNode;
}

void Mempool::Free(void* p)
{
        Item_Node* tmpItemNode = static_cast<Item_Node*>(p);
        tmpItemNode->next = freeItemNodeHead;
        freeItemNodeHead = tmpItemNode;
}


int main()
{
        Mempool pool;
        char* p = NULL;
        int i = 0;
        while(i < 100000)
        {
                    p = static_cast<char*>(pool.Alloc());
                    strcpy(p, "Hello");
                    cout<<i<<" : "<<p<<endl;
                    ++i;
                    pool.Free(p);
        }

        return 0;
}

分享到:
评论

相关推荐

    C++多线程内存池和简单的BUFFER类

    总的来说,C++多线程内存池和简单的BUFFER类是解决高并发、高性能问题的有效手段。通过合理的设计和实现,我们可以创建出高效、稳定、线程安全的程序。在实际应用中,这不仅可以优化内存管理,还能降低延迟,提升...

    MemoryPool:使用 C++11 的简单内存池实现

    在C++11中,我们可以利用其新引入的特性来实现一个简单的内存池。本项目就是针对这一主题的一个实践,适用于Visual Studio 2015、g++4.8和clang++3.4等编译器。 内存池的基本思想是避免频繁的系统调用,因为传统的...

    C++内存池完整代码memory_pool.rar

    下面将详细阐述内存池的工作原理以及如何实现一个简单的内存池。 内存池的基本思想是预先分配一大块内存,然后根据需求从中切割出合适大小的小块内存供程序使用。这种预先分配的方式可以避免系统频繁地进行碎片整理...

    C++内存池完整代码memory_pool.zip

    在"memory_pool.zip"这个压缩包中,我们可以预期包含了一个实现C++内存池的源码项目。"Makefile"是用于编译和构建项目的配置文件,它定义了如何将源代码文件编译成可执行程序或库。我们可以通过运行`make`命令来编译...

    C++简单内存池模板类实现

    自己实现的c++内存池,模板类实现,具备基础内存块,递增梯度,最大内存块等配置参数,初始化时分配好一批内存块供作用,当内存块不够使用时,已经分配内存块小于最大内存块个数,则再分配递增梯度个内存块,如果...

    C++简单内存池代码

    在给定的资源中,`memorypool.cpp`、`allocator.h`和`memorypool.h`文件很可能是实现了一个简单的内存池系统。`memorypool.cpp`是实现文件,`allocator.h`可能包含了内存分配器的接口定义,而`memorypool.h`则是内存...

    C++内存池的管理

    本篇将深入探讨C++内存池的原理、实现及应用。 内存池的概念源于操作系统中的内存管理,它是一种预先分配一大块连续内存,并按照预设大小进行分割,供应用程序按需分配和释放的小块内存的方法。内存池通过批量管理...

    C++实现简单的内存池

    本文将详细介绍如何使用C++实现一个简单的内存池。 在C++中,内存管理主要由new和delete操作符处理。每次调用new都会导致系统调用malloc或类似的函数,寻找合适大小的内存块;而delete则会调用free释放内存。但这种...

    C++内存池使用方法

    如代码所示,这是一个简单的单线程固定大小的内存池实现。模板类`SimpleMemPool`接收一个类型`T`和一个基础大小`BaseSize`作为参数。`ObjectChunk`是一个联合体,包含一个指向下一个`ObjectChunk`的指针和一个大小为...

    c++ 实现 内存池 pool

    本文将详细讲解如何使用C++实现一个简单的内存池。首先,我们需要理解内存池的基本原理: 1. **内存池的创建**:在程序启动时,内存池会根据需求预先分配一大块内存。这通常由`new`操作符完成,一次性分配足够的...

    c++实现简单内存池,维护可使用列表

    总结来说,C++实现的简单内存池通过预先分配大块内存和维护自由列表,提高了内存管理的效率,特别适合处理大量小对象的创建和销毁。通过理解并掌握内存池的原理和实现,开发者可以更好地优化程序的内存使用,提升...

    一个简单内存池的实现

    本主题将详细介绍一个简单的内存池实现,并探讨其工作原理。 首先,我们需要理解内存池的基本概念。内存池是预先分配的一大块连续内存,它被分割成多个固定大小的小块,供用户按需分配。这种方式避免了系统级别的...

    C++ 内存管理算法和实现.

    总的来说,C++内存管理是一个深奥的话题,涵盖了许多底层细节和高级技术。理解和掌握这些知识对于编写高效、健壮的C++代码至关重要。通过深入学习,我们可以更好地利用内存,减少错误,提升程序性能。

    c++应用程序性能优化之内存池

    - **固定内存池**:所有分配的内存单元大小相同,适用于分配固定大小对象的情形,实现简单且效率高。 - **可变内存池**:支持不同大小的内存单元分配,灵活性更高,但实现复杂度也相应增加。 #### 内存池工作原理...

    C++应用程序性能优化之内存池

    ### C++应用程序性能优化之内存池 #### 一、引言与重要性 在C++程序设计中,性能优化是一项至关重要的任务,特别是在资源管理和计算密集型应用中。内存管理,尤其是内存池技术,是提升C++应用程序效率的关键策略之...

    C++实现的对象池,简单好用

    C++实现的对象池,简单好用。就一个h文件,不需要库依赖

    自制简单的内存池实现

    自己实现的一个简单内存池 /* * MyMemoryPool.hpp * * Copyright (C) 2016 - yasin1151 * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU ...

    简单内存池

    3. C++内存池实现步骤: - 预分配内存:使用`new`运算符一次性申请一大块内存。 - 划分内存:根据需要的内存块大小,将预分配的内存分割为若干个内存单元。 - 分配内存:当程序请求内存时,从空闲的内存单元中...

    100行C++代码实现线性池

    线性池,也称为对象池或者...100行C++代码实现的线性池是一个实用的示例,可以帮助我们深入理解内存池的工作原理和C++中的内存管理。对于想要提升C++编程技巧,尤其是内存管理方面的人来说,这是一个很好的学习资源。

    C++ ACE开发中的的内存管理

    这样做的好处是保持与C++标准兼容,同时可以利用ACE库的其他特性,如线程安全或内存池。在某些情况下,如果需要对`new`和`delete`进行额外的控制或优化,ACE_New_Allocator是一个不错的选择。 在实际应用中,例如在...

Global site tag (gtag.js) - Google Analytics