oiramario
随笔- 293 文章- 1 评论- 664
博客园
首页
新随笔
新文章
联系
管理
订阅
相关Memory Pool的使用
自从很久以前看了侯捷老师的《池内春秋》一文后
就有想把sgi stl中的memory pool搞出来自己用
但是一直没动手……
要学的东西实在是太多了……
认为只要大量使用std::container就可以不用自己写内存池了
例如用std::vector<char>代替new char []
上次C++大会,听到云风谈到在写server端时,自己操作内存池是很有必要的
12月份看到《游戏创造》中有一文已实现了最初的想法
照文中所说去网站却下载不到源码,郁闷……
开始自己动手翻资料写程序
原来很简单……
struct
Base
{
float
sz[
64
];
/**/
/*
virtual ~Base()
{
}
*/
}
;
struct
Test :
public
Base
{
}
;
struct
TestAlloc :
public
Base
{
static
std::allocator
<
char
>
alloc;
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;
测试了一下
int
_tmain(
int
argc, _TCHAR
*
argv[])
{
const
Times
=
10000000
;
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;
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;
return
0
;
}
发现要比普通的快近一倍
但是也正如文中所说,>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
参考资料
您可以参阅本文在 developerWorks 全球站点上的
英文原文
。
Web 上的文档
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 系统。
关于 malloc 的文章
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++ 的垃圾收集器的文章。
Web 上的通用参考资料
内存管理参考
中有很多关于内存管理参考资料和技术文章的链接。
关于内存管理和内存层级的 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
自我管理数据缓冲区内存
(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 书籍
。
posted on 2006-01-10 10:27
千里马肝
阅读(791)
评论(2)
编辑
收藏
评论
回复
引用
查看
2006-01-14 00:33 |
疯子阿虹 [未注册用户]
:)
的确可以很方便的把STL的MEMPOOL代码copy出来然后修改一下。
而且支持多线:)
不过令人不爽的有两个地方
1。不能调用构造/析构,不过这个可以解决。
2。分配数组比较麻烦:(
回复
引用
查看
2006-01-15 22:25 |
千里马肝
我认为作为memory pool应该是系统级做会更好
如果只是object级别,会出现A类对象还有闲置,而B类对象不够了,却没有权限去找A要
所以个人认为使用memory pool的malloc来替换掉crt中的版本会比较好
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2006-01-13 10:26 编辑过
另存
打印
最新IT新闻:
博客园新闻频道
博客园首页
社区
<
2006年1月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
与我联系
发短消息
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
(33)
给我留言
查看留言
我参与的团队
计算机图形学(2/375)
我的标签
3dxi 3dmax sdk plugin ogre(1)
ogre plugin 3dmax exporter 3dxi(1)
卡通渲染(1)
随笔档案
(292)
2008年7月 (2)
2008年6月 (2)
2008年4月 (1)
2008年3月 (2)
2008年2月 (1)
2007年11月 (3)
2007年10月 (4)
2007年9月 (2)
2007年8月 (10)
2007年7月 (8)
2007年6月 (4)
2007年4月 (10)
2007年3月 (13)
2007年2月 (1)
2007年1月 (3)
2006年12月 (12)
2006年11月 (17)
2006年10月 (13)
2006年9月 (21)
2006年8月 (19)
2006年7月 (27)
2006年6月 (5)
2006年5月 (10)
2006年4月 (26)
2006年3月 (21)
2006年2月 (11)
2006年1月 (8)
2005年12月 (12)
2005年11月 (17)
2005年10月 (7)
文章档案
(1)
2008年5月 (1)
好友
朝三暮四郎
小叶子
游戏里的羔羊
搜索
最新评论
1. re: 卡通渲染进阶 = toonlighting + outline + rimlighting + hair specular
效果很不错,请问这个是实时渲染的效果吗?
--tonylk
2. re: 卡通渲染进阶 = toonlighting + outline + rimlighting + hair specular
不太明白阿
--WilsonWu
3. re: 卡通渲染进阶 = toonlighting + outline + rimlighting + hair specular
园子原来也有玩3d max的哈
--水言木
4. re: 卡通渲染进阶 = toonlighting + outline + rimlighting + hair specular
这个是什么啊
--生鱼片
5. re: DirectX SDK (March 2008) Released
不再支持.net。那么该怎么办?
--manchangx
阅读排行榜
1. 全文:在游戏中使用CEGUI —— 第一章(底层)(8109)
2. 暴雪COO确认:星际争霸2.0要来了(4572)
3. [转]蜀汉丞相诸葛亮著名预言《马前课》详解(3523)
4. 推荐的C++书籍以及阅读顺序(3314)
5. C++大会后的一些感想(1888)
评论排行榜
1. 补CEGUIFont_xmlHandler.cpp(30)
2. [转]蜀汉丞相诸葛亮著名预言《马前课》详解(29)
3. CEGUI中文处理(补)(19)
4. 全文:在游戏中使用CEGUI —— 第一章(底层)(19)
5. 在游戏中使用CEGUI —— 第一章(底层),已刊登在《游戏创造》7月刊(14)