哈哈,题目都说了,偷别人的内存管理。俺就坏人了^_^
很多时候,为了获得较好的内存性能,需要重载一下new。自己由于考虑服务器内存的问题,希望有较好的性能,和较少的碎片(服务器要长期运行的),又不喜欢太野蛮(一把申请一大堆内存,以后在里面分配。在微软XBOX小组组长的主页上,有几个定制的内存适配器,其中有静态分配就是这种方式,实际运行下来,发现效果并不理想。遗憾的是,这里不能给大家提供连接,机器重装把网址搞丢了,就记下了这个结论),自己写?还真不一定写的怎么好。幸好有别人的肩膀可以借用一下——SGI版STL实现的内存管理(对内存碎片和管理性能进行了严格考虑,而且事实证明非常有效)。
俺用的是STLport。具体的就偷它了:
.h头文件
#include <vector>
struct __impl_
{
void *operator new( size_t size )
{
return alloc.allocate( size );
}
void operator delete( void *obj, size_t size )
{
alloc.deallocate( static_cast< char * >( obj ),size );
}
static std::allocator< char > alloc;
};
.cpp实现文件
std::allocator< char > __impl_::alloc
以后,只要继承__impl_就可以了。而且不用当心兼容问题,stl的allocator是C++标准。 不过,需要说明的是,STLport现在的做法是会特意泄漏内存的,如果你检测到内存泄漏,不要奇怪和大惊。经过讨论,STLport采用了特意不回收收集的小块内存,而借助现代操作系统的自动回收能力(应用程序退出时会收回分配给进程的内存)的做法,以减少内存印记、获得较好的再分配能力和性能。具体的详细解释,可以读源码,上STLport的交流论坛,或者看《STL源码剖析》——里面有关于SGI内存适配器(也是STLport所采用的)的解析。
/////////////////////////////////以下内容于 2006-2-25 添加///////////////////////////////// 最近一直在思考,如何隐藏线程(这里就是想提供线程安全的版本)。今天,突然想到重载的new的线程安全,原始的new和malloc显然在多线程环境下是安全的,但是被重载的就不一定了。去看了STLport的源码。比较可惜的是,
这个allocator是多线程不安全的,必需借助内部实现,我的STLport5.0只能用__multithreaded_alloc了。
/////////////////////////////////以下内容于 2006-3-6 添加///////////////////////////////// 可以不用直接访问内部的__multithreaded_alloc,只要采用多线程方式编译代码,编译器会根据宏开关自动选择线程安全版本(STLport的宏还真麻烦^_^)。