`
javasogo
  • 浏览: 1835418 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

一个分配固定大小块的内存池(memory pool) 的例子 FROM POCO

 
阅读更多

//
// MemoryPool.h
//
// $Id: //poco/1.4/Foundation/include/Poco/MemoryPool.h#1 $
//
// Library: Foundation
// Package: Core
// Module:MemoryPool
//
// Definition of the MemoryPool class.
//
// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
// and Contributors.
//

/*
//z 2011-06-23 15:13:07@is2120.CSDN 转载请注明出处
设计思想:
比较简单,申请若干个(128)固定大小的内存块,
将各内存块指针存放在vector中,申请则出vector,释放则回收到vec中去。
*/

#ifndef Foundation_MemoryPool_INCLUDED
#define Foundation_MemoryPool_INCLUDED


#include "Poco/Foundation.h"
#include "Poco/Mutex.h"
#include <vector>
#include <cstddef>


namespace Poco {

/*
14:01 2011-6-23
一个固定大小内存块的pool
这个class的主要目的是加速内存分配
同时在相同大小的块一遍又一遍分配时避免了内存碎片
*/

class Foundation_API MemoryPool
/// A simple pool for fixed-size memory blocks.
///
/// The main purpose of this class is to speed-up
/// memory allocations, as well as to reduce memory
/// fragmentation in situations where the same blocks
/// are allocated all over again, such as in server
/// applications.
///
/// All allocated blocks are retained for future use.
/// A limit on the number of blocks can be specified.
/// Blocks can be preallocated.
{
public :
MemoryPool(std::size_t blockSize,int preAlloc =0 ,int maxAlloc =0 );
//z@is2120 14:03 2011-6-23
//z 使用给定的blocksize创建一个memorypool。
//z 预分配的大小由preAlloc指定
/// Creates a MemoryPool for blocks with the given blockSize.
/// The number of blocks given in preAlloc are preallocated.

~MemoryPool();

//z 从memory pool中得到一个block
void * get();
/// Returns a memory block. If there are no more blocks
/// in the pool, a new block will be allocated.
///
/// If maxAlloc blocks are already allocated, an
/// OutOfMemoryException is thrown.

//z 将一个 memory block 返回到pool中去。
void release(void * ptr);
/// Releases a memory block and returns it to the pool.

//z 返回 block size
std::size_t blockSize()const ;
/// Returns the block size.

//z 返回已分配的 blocks 的数目
int allocated()const ;
/// Returns the number of allocated blocks.

//z 返回在pool中可用的块数目
int available()const ;
/// Returns the number of available blocks in the pool.

private :
//z 禁用了默认构造函数;拷贝构造函数以及赋值构造函数
MemoryPool();
MemoryPool(const MemoryPool&);
MemoryPool&operator = (const MemoryPool&);

//z 保留128的block
enum
{
BLOCK_RESERVE =128
};

//z 使用了vector来保存block的地址
typedef std::vector<char *> BlockVec;

//z 块大小
std::size_t _blockSize;
//z 允许的最大块数目
int _maxAlloc;
//z 已分配
int _allocated;
//z 存储块地址的容器
BlockVec_blocks;
//z 互斥
FastMutex _mutex;
};


//
// inlines
//
//z 返回块大小
inline std::size_t MemoryPool::blockSize()const
{
return _blockSize;
}

//z 返回总的分配的数目
inline int MemoryPool::allocated()const
{
return _allocated;
}

//z 凡存在blocks中的都是未交付使用的(但已分配)
inline int MemoryPool::available()const
{
return (int ) _blocks.size();
}


}// namespace Poco


#endif // Foundation_MemoryPool_INCLUDED

#include "Poco/MemoryPool.h"
#include "Poco/Exception.h"

namespace Poco {


MemoryPool::MemoryPool(std::size_t blockSize,int preAlloc,int maxAlloc):
_blockSize(blockSize),
_maxAlloc(maxAlloc),
_allocated(preAlloc)
{
poco_assert (maxAlloc ==0 || maxAlloc >= preAlloc);
poco_assert (preAlloc >=0 && maxAlloc >=0 );

int r = BLOCK_RESERVE;
if (preAlloc > r)
r = preAlloc;
if (maxAlloc >0 && maxAlloc < r)
r = maxAlloc;

//z vector 保留r空间
_blocks.reserve(r);

for (int i =0 ; i < preAlloc; ++i)
{
//z 直接分配;此时会不会出现异常?
_blocks.push_back(new char [_blockSize]);
}
}

MemoryPool::~MemoryPool()
{
//z 所有的都放在blockvec中
for (BlockVec::iterator it = _blocks.begin(); it != _blocks.end(); ++it)
{
delete [] *it;
}
}


void * MemoryPool::get()
{
FastMutex::ScopedLock lock(_mutex);

if (_blocks.empty())
{
if (_maxAlloc ==0 || _allocated < _maxAlloc)
{
++_allocated;
return new char [_blockSize];
}
else throw OutOfMemoryException("MemoryPool exhausted" );
}
else
{
//z 从尾端取出一个
char * ptr = _blocks.back();
//z 从尾端弹出
_blocks.pop_back();
return ptr;
}
}


void MemoryPool::release(void * ptr)
{
FastMutex::ScopedLock lock(_mutex);

//z 将get的内存还回vec中去。
_blocks.push_back(reinterpret_cast <char *>(ptr));
}


}// namespace Poco

分享到:
评论

相关推荐

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

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

    Memory Pool内存管理

    描述中的注释“一个分配固定大小内存的内存池,使用链表维护”揭示了内存池的实现方式。链表在这里的作用是跟踪和管理内存块的状态,每个内存块可以视为链表的一个节点,包含其大小信息和指向下一个内存块的指针。...

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

    内存池是一种优化内存分配策略的技术,它主要用于提高内存分配和释放的效率,特别是在频繁进行小块内存分配的应用中。在C++中,内存池通过预分配一大块连续内存,并进行精细化管理来替代标准库中的new和delete操作。...

    memory pool implementation on Linux

    3. **内存分配**:当程序需要内存时,内存池会从空闲的内存块中找一个合适的分配出去,而不是每次都向系统申请。这可以通过遍历内存块管理结构来实现,找到第一个未分配的块并将其标记为已分配。 4. **内存释放**:...

    固定块内存池c语言实现

    2. **固定块大小**:内存池中的每个内存块大小是固定的,这样可以简化内存分配和释放的过程。当需要特定大小的内存时,可以从对应的内存池中直接获取,而无需查找合适大小的内存块。 3. **内存池结构**:通常,内存...

    c++ 实现 内存池 pool

    内存池(Memory Pool)是一种优化内存分配和管理的技术,它主要应用于频繁进行小块内存分配的场景。在C++中,内存池通过预先一次性分配一大块连续内存,并将其分割成多个固定大小的小块,用于后续的内存分配。这种...

    Memory Pool

    当程序需要动态分配内存时,不再直接调用C++中的`new`或C语言中的`malloc`函数,而是从内存池中选择一个合适大小的内存块进行分配。这样做的好处在于减少了系统调用的次数,避免了内存碎片,提高了内存分配和释放的...

    一种自适应变长块内存池

    这种内存池结合了Apache内存池和固定块内存池的优点,实现了快速的内存分配和回收,同时减少了内存碎片。 #### 三、SVBSMP的设计原理 ##### 1. 结构设计 SVBSMP主要包括两种结构: - **内存块(Mem Block)**: 这...

    Super-memory-pool.rar_super_内存池

    内存池是一种优化内存分配策略的技术,它在程序运行前预先分配一大块连续的内存空间,然后根据需要从中划分出小块内存供程序使用。这种方式可以减少系统调用的开销,提高内存分配与释放的效率,尤其对于频繁的小内存...

    Super-memory-pool.rar_memory pool_super

    "Super-memory-pool.rar_memory pool_super"这个压缩包文件提供了一种解决方案,它包含四个文件,旨在帮助用户实现一个自定义的内存池,以替代标准的new和delete操作,从而提高内存分配的效率。 内存池的基本思想是...

    简易的内存池实现

    内存池是一种优化内存分配策略的技术,它通过预先申请一大块连续的内存,并将其划分为多个固定大小的小块,供程序动态分配使用。这种方式避免了频繁的系统调用,提高了内存分配和释放的效率,尤其在大量小对象创建与...

    Fast Efficient Fixed-Sized Memory Pool

    固定大小内存池(Memory Pool)的核心思想是将内存分割成固定大小的块或区域(称为池),而不是使用通用的内存管理系统。这种策略对于需要快速分配和回收大量相同大小对象的场景,例如游戏引擎,具有显著的性能优势...

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

    这个例子中,内存池在构造时会预先分配指定大小和数量的内存块,然后在需要时从这些内存块中分配内存,释放时则将内存归还到内存池而不是直接释放。 在实际应用中,内存池可以进一步优化,例如通过链表或哈希表来...

    linux内存池代码实例

    在Linux系统中,内存管理是操作系统的核心组成部分,内存池(Memory Pool)是一种高效的内存分配策略。内存池通过预先分配一大块连续的内存区域,并对其进行分割和管理,为应用程序提供内存分配服务,以此来提高内存...

    linyanx-memory-pool-master.rar

    "linyanx-memory-pool-master"是一个针对Linux平台实现的内存池项目,它采用了SALB(Size-Aligned Local Block)思想,旨在提供一种高效且灵活的内存管理方案。 SALB思想的核心是将内存按照特定大小的块进行划分,...

    几种内存池的实现(c/c++ 源码)

    内存池是一种优化内存分配策略的技术,它通过预先分配一大块连续的内存,并将这些内存划分为多个固定大小的小块,来提升程序运行效率和降低内存碎片。在C/C++编程中,内存池常用于频繁创建和销毁小对象的场景,如...

    memory pool14.pptx

    内存池是一种内存管理技术,主要用于优化内存分配和释放的效率,尤其在大量小对象的生命周期管理中非常有用。本PPT“memory pool14.pptx”深入解析了内存池的内部实现和工作原理。 首先,内存池在初始化时会进行一...

    linux服务器开发C语言内存池实现

    为了优化内存分配性能,提高系统效率并减少内存碎片,开发者通常会采用内存池(Memory Pool)技术。本文将深入探讨如何使用C语言来实现一个内存池。 内存池是一种预先分配大量内存并进行管理的技术,它允许应用程序...

    C语言实现完整功能的内存池

    2. **内存分配函数**:如`malloc_from_pool`,它从内存池中找出合适大小的内存块并标记为已分配。如果没有合适大小的块,可能需要从系统调用`malloc`获取更大内存,然后将其分割为更小的块。 3. **内存释放函数**:...

    MemoryPool 实用的例子程序

    - 内存分配函数:如 `allocate()`,它会从内存池中找一个合适的内存块并返回。 - 内存释放函数:如 `deallocate()`,将内存块标记为可用状态,但不归还给操作系统。 - 扩展和收缩:当内存池内的内存块不够用或过多时...

Global site tag (gtag.js) - Google Analytics