相关Memory Pool的使用
自从很久以前看了侯捷老师的《池内春秋》一文后
就有想把sgi stl中的memory pool搞出来自己用
但是一直没动手……
要学的东西实在是太多了……
认为只要大量使用std::container就可以不用自己写内存池了
例如用std::vector<char>代替new char []
上次C++大会,听到云风谈到在写server端时,自己操作内存池是很有必要的
12月份看到《游戏创造》中有一文已实现了最初的想法
照文中所说去网站却下载不到源码,郁闷……
开始自己动手翻资料写程序
原来很简单……
struct Base
{
float sz[64];
![](/Images/OutliningIndicators/InBlock.gif)
/*
virtual ~Base()
{
}
*/
};
![](/Images/OutliningIndicators/None.gif)
struct Test : public Base
{
};
![](/Images/OutliningIndicators/None.gif)
struct TestAlloc : public Base
{
static std::allocator<char> alloc;
![](/Images/OutliningIndicators/InBlock.gif)
static void *operator new(size_t size)
{
if (size > 128)
return ::operator new(size);
else
return alloc.allocate(size);
}
static void operator delete(void* p, size_t size)
{
if (size > 128)
::operator delete(p);
else
alloc.deallocate(static_cast<char *>(p), size);
}
};
std::allocator< char > TestAlloc::alloc;
![](/Images/OutliningIndicators/None.gif)
测试了一下
int _tmain(int argc, _TCHAR* argv[])
{
const Times = 10000000;
![](/Images/OutliningIndicators/InBlock.gif)
DWORD begin = 0, end = 0;
begin = GetTickCount();
for (size_t n=0; n<Times; ++n)
{
Test *p = new Test;
delete p;
}
end = GetTickCount();
std::cout << "Test time :" << end - begin << std::endl;
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
begin = GetTickCount();
for (size_t n=0; n<Times; ++n)
{
TestAlloc *p = new TestAlloc;
delete p;
}
end = GetTickCount();
std::cout << "TestAlloc time :" << end - begin << std::endl;
![](/Images/OutliningIndicators/InBlock.gif)
return 0;
}
![](/Images/OutliningIndicators/None.gif)
发现要比普通的快近一倍
但是也正如文中所说,>128 bytes的还是使用::operator new/delete
不爽ing~
再仔细看文章
发现一个关键字Doug Lea
然后找到这里http://gee.cs.oswego.edu/dl/html/malloc.html
发现他的想法与sgi stl类似,但是没有128的限制,竟然是
爽了~
备份资料
引用自http://www-128.ibm.com/developerworks/cn/linux/l-memory/?ca=dwcn-newsletter-linux#resources
就有想把sgi stl中的memory pool搞出来自己用
但是一直没动手……
要学的东西实在是太多了……
认为只要大量使用std::container就可以不用自己写内存池了
例如用std::vector<char>代替new char []
上次C++大会,听到云风谈到在写server端时,自己操作内存池是很有必要的
12月份看到《游戏创造》中有一文已实现了最初的想法
照文中所说去网站却下载不到源码,郁闷……
开始自己动手翻资料写程序
原来很简单……
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
测试了一下
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
发现要比普通的快近一倍
但是也正如文中所说,>128 bytes的还是使用::operator new/delete
不爽ing~
再仔细看文章
发现一个关键字Doug Lea
然后找到这里http://gee.cs.oswego.edu/dl/html/malloc.html
发现他的想法与sgi stl类似,但是没有128的限制,竟然是
![](http://gee.cs.oswego.edu/dl/html/malloc2.gif)
爽了~
备份资料
引用自http://www-128.ibm.com/developerworks/cn/linux/l-memory/?ca=dwcn-newsletter-linux#resources
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文。
- GNU C Library 手册的 obstacks 部分 提供了 obstacks 编程接口。
- Apache Portable Runtime 文档 描述了它们的池式分配程序的接口。
- Doug Lea 的 Malloc 是最流行的内存分配程序之一。
- BSD Malloc 用于大部分基于 BSD 的系统中。
- ptmalloc 起源于 Doug Lea 的 malloc,用于 GLIBC 之中。
- Hoard 是一个为多线程应用程序优化的
malloc
实现。
- GNU Memory-Mapped Malloc(GDB 的组成部分) 是一个基于
mmap()
的malloc
实现。
- ElectricFence Malloc Debugger 是一个调试程序中内存问题的
malloc
实现。
- GNU Obstacks(GNU Libc 的组成部分)是安装最多的池式分配程序,因为在每一个基于 glibc 的系统中都有它。
- Apache 的池式分配程序(Apache Portable Runtime 中) 是应用最为广泛的池式分配程序。
- Squid 有其自己的池式分配程序。
- NetBSD 也有其自己的池式分配程序。
- talloc 是一个池式分配程序,是 Samba 的组成部分。
- Loki C++ Library 有很多为 C++ 实现的通用模式,包括智能指针和一个定制的小对象分配程序。
- Hahns Boehm Conservative Garbage Collector 是最流行的开源垃圾收集器,它可以用于常规的 C/C++ 程序。
- Marshall Kirk McKusick 和 Michael J. Karels 合著的 A New Virtual Memory Implementation for Berkeley UNIX 讨论了 BSD 的 VM 系统。
- Mel Gorman's Linux VM Documentation 讨论了 Linux VM 系统。
- Poul-Henning Kamp 撰写的 Malloc in Modern Virtual Memory Environments 讨论的是
malloc
以及它如何与 BSD 虚拟内存交互。
- Berger、McKinley、Blumofe 和 Wilson 合著的 Hoard -- a Scalable Memory Allocator for Multithreaded Environments 讨论了 Hoard 分配程序的实现。
- Marshall Kirk McKusick 和 Michael J. Karels 合著的 Design of a General Purpose Memory Allocator for the 4.3BSD UNIX Kernel 讨论了内核级的分配程序。
- Doug Lea 撰写的 A Memory Allocator 给出了一个关于设计和实现分配程序的概述,其中包括设计选择与折衷。
- Emery D. Berger 撰写的 Memory Management for High-Performance Applications 讨论的是定制内存管理以及它如何影响高性能应用程序。
- Doug Lea 撰写的 Some Storage Management Techniques for Container Classes 描述的是为 C++ 类编写定制分配程序。
- Berger、Zorn 和 McKinley 合著的 Composing High-Performance Memory Allocators 讨论了如何编写定制分配程序来加快具体工作的速度。
- Berger、Zorn 和 McKinley 合著的 Reconsidering Custom Memory Allocation 再次提及了定制分配的主题,看是否真正值得为其费心。
- Paul R. Wilson 撰写的 Uniprocessor Garbage Collection Techniques 给出了垃圾收集的一个基本概述。
- Benjamin Zorn 撰写的 The Measured Cost of Garbage Collection 给出了关于垃圾收集和性能的硬数据(hard data)。
- Hans-Juergen Boehm 撰写的 Memory Allocation Myths and Half-Truths 给出了关于垃圾收集的神话(myths)。
- Hans-Juergen Boehm 撰写的 Space Efficient Conservative Garbage Collection 是一篇描述他的用于 C/C++ 的垃圾收集器的文章。
- 内存管理参考 中有很多关于内存管理参考资料和技术文章的链接。
- 关于内存管理和内存层级的 OOPS Group Papers 是非常好的一组关于此主题的技术文章。
- C++ 中的内存管理讨论的是为 C++ 编写定制的分配程序。
- Programming Alternatives: Memory Management 讨论了程序员进行内存管理时的一些选择。
- 垃圾收集 FAQ 讨论了关于垃圾收集您需要了解的所有内容。
- Richard Jones 的 Garbage Collection Bibliography 有指向任何您想要的关于垃圾收集的文章的链接。
- 用于动态存储分配和内存管理的调试工具 很好地列出了用于在程序中寻找内存问题的
malloc
实现。
- Michael Daconta 撰写的 C++ Pointers and Dynamic Memory Management 介绍了关于内存管理的很多技术。
- Frantisek Franek 撰写的 Memory as a Programming Concept in C and C++ 讨论了有效使用内存的技术与工具,并给出了在计算机编程中应当引起注意的内存相关错误的角色。
- Richard Jones 和 Rafael Lins 合著的 Garbage Collection: Algorithms for Automatic Dynamic Memory Management 描述了当前使用的最常见的垃圾收集算法。
- 在 Donald Knuth 撰写的 The Art of Computer Programming 第 1 卷 Fundamental Algorithms 的第 2.5 节“Dynamic Storage Allocation”中,描述了实现基本的分配程序的一些技术。
- 在 Donald Knuth 撰写的 The Art of Computer Programming 第 1 卷 Fundamental Algorithms 的第 2.3.5 节“Lists and Garbage Collection”中,讨论了用于列表的垃圾收集算法。
- Andrei Alexandrescu 撰写的 Modern C++ Design 第 4 章“Small Object Allocation”描述了一个比 C++ 标准分配程序效率高得多的一个高速小对象分配程序。
- Andrei Alexandrescu 撰写的 Modern C++ Design 第 7 章“Smart Pointers”描述了在 C++ 中智能指针的实现。
- Jonathan 撰写的 Programming from the Ground Up 第 8 章“Intermediate Memory Topics”中有本文使用的简单分配程序的一个汇编语言版本。
- 自我管理数据缓冲区内存 (developerWorks,2004 年 1 月)略述了一个用于管理内存的自管理的抽象数据缓存器的伪 C (pseudo-C)实现。
- A framework for the user defined malloc replacement feature (developerWorks,2002 年 2 月)展示了如何利用 AIX 中的一个工具,使用自己设计的内存子系统取代原有的内存子系统。
- 掌握 Linux 调试技术 (developerWorks,2002 年 8 月)描述了可以使用调试方法的 4 种不同情形:段错误、内存溢出、内存泄漏和挂起。
- 在 处理 Java 程序中的内存漏洞 (developerWorks,2001 年 2 月)中,了解导致 Java 内存泄漏的原因,以及何时需要考虑它们。
- 在 developerWorks Linux 专区中,可以找到更多为 Linux 开发人员准备的参考资料。
- 从 developerWorks 的 Speed-start your Linux app 专区中,可以下载运行于 Linux 之上的 IBM 中间件产品的免费测试版本,其中包括 WebSphere® Studio Application Developer、WebSphere Application Server、DB2® Universal Database、Tivoli® Access Manager 和 Tivoli Directory Server,查找 how-to 文章和技术支持。
- 通过参与 developerWorks blogs 加入到 developerWorks 社区。
- 可以在 Developer Bookstore Linux 专栏中定购 打折出售的 Linux 书籍。