我有一个Visual Studio 2008 C应用程序,我正在为标准容器使用自定义分配器,以便它们的内存来自内存映射文件而不是堆.此分配器用于4种不同的用例:
> 104字节固定大小的结构std :: vector< SomeType,MyAllocator< SomeType> > FOO;
> 200字节固定大小的结构
> 304字节固定大小的结构
> n字节字符串std :: basic_string< char,std :: char_traits< char>,MyAllocator< char> > STRN;
我需要能够为这些中的每一个分配大约32MB的总和.
分配器使用指向分配大小的std :: map来跟踪内存使用情况. typedef std :: map< void *,size_t>超级;每个SuperBlock代表4MB内存.
有一个std :: vector<超级块>其中一个超级块没有足够的空间.
用于分配器的算法如下:
>对于每个SuperBlock:SuperBlock末尾是否有空格?把分配放在那里. (快速)
>如果没有,在每个SuperBlock中搜索足够大的空白空间并将分配放在那里. (慢)
>什么都没有?分配另一个SuperBlock并将分配放在新SuperBlock的开头.
不幸的是,一段时间后,第2步可能变得非常缓慢.随着对象的复制和临时变量的破坏,我得到了很多碎片.这导致在存储器结构内进行大量深度搜索.碎片存在问题,因为我使用的内存有限(请参阅下面的注释)
任何人都可以建议改进这种算法来加速这个过程吗?我需要两个单独的算法(1个用于固定大小的分配,1个用于字符串分配器)?
注意:对于那些需要理由的人:我在Windows Mobile中使用此算法,其中Heap有32MB的进程槽限制.所以,通常的std :: allocator不会削减它.我需要将分配放在1GB大内存区域中以获得足够的空间,这就是它的作用.