我有一个Visual Studio 2008 C ++应用程序,在其中使用了自定义分配器来为标准容器提供内存,以便它们的内存来自内存映射文件而不是堆。该分配器用于4种不同的用例:
1. 104字节固定大小结构std::vector< SomeType, MyAllocator< SomeType > > foo; 2. 200字节固定大小结构 3. 304字节固定大小结构 4. n字节字符串std::basic_string< char, std::char_traits< char >, MyAllocator< char > > strn;
我需要能够为每个用例大约分配32MB。
分配器使用指向分配大小的指针的std::map跟踪内存使用情况。typedef std::map< void*, size_t > SuperBlock; 每个SuperBlock代表4MB的内存。
如果一个SuperBlock的空间不足,则会有一个std::vector< SuperBlock >的容器,以便创建另一个SuperBlock。
分配器的算法如下所示:
1. 对于每个SuperBlock:末尾是否有空间?将分配放置在那里。(快速) 2. 如果没有,请搜索每个SuperBlock中是否具有足够大小的空闲空间,并将分配放置在那里。(慢) 3. 仍然没有吗?分配另一个SuperBlock并将分配放在新SuperBlock的开头。
不幸的是,步骤2在一段时间后可能变得非常慢。随着对象的复制和临时变量的销毁,我会遇到许多内存碎片化问题。这将导致在内存结构中进行大量深度搜索。由于我有一定量的内存可用(请参见下面的说明),因此碎片化是一个问题。
是否有人能够提出可以加快此算法速度的改进方法?我需要两个单独的算法(一个用于固定大小的分配,一个用于字符串分配)吗?
注:对于那些需要原因的人:我将在Windows Mobile中使用此算法,其中堆有32MB的进程槽限制。因此,通常的std::allocator行不通。我需要将分配放置在1GB的大型内存区域中以获得足够的空间,这就是这个算法所做的。
1. 104字节固定大小结构std::vector< SomeType, MyAllocator< SomeType > > foo; 2. 200字节固定大小结构 3. 304字节固定大小结构 4. n字节字符串std::basic_string< char, std::char_traits< char >, MyAllocator< char > > strn;
我需要能够为每个用例大约分配32MB。
分配器使用指向分配大小的指针的std::map跟踪内存使用情况。typedef std::map< void*, size_t > SuperBlock; 每个SuperBlock代表4MB的内存。
如果一个SuperBlock的空间不足,则会有一个std::vector< SuperBlock >的容器,以便创建另一个SuperBlock。
分配器的算法如下所示:
1. 对于每个SuperBlock:末尾是否有空间?将分配放置在那里。(快速) 2. 如果没有,请搜索每个SuperBlock中是否具有足够大小的空闲空间,并将分配放置在那里。(慢) 3. 仍然没有吗?分配另一个SuperBlock并将分配放在新SuperBlock的开头。
不幸的是,步骤2在一段时间后可能变得非常慢。随着对象的复制和临时变量的销毁,我会遇到许多内存碎片化问题。这将导致在内存结构中进行大量深度搜索。由于我有一定量的内存可用(请参见下面的说明),因此碎片化是一个问题。
是否有人能够提出可以加快此算法速度的改进方法?我需要两个单独的算法(一个用于固定大小的分配,一个用于字符串分配)吗?
注:对于那些需要原因的人:我将在Windows Mobile中使用此算法,其中堆有32MB的进程槽限制。因此,通常的std::allocator行不通。我需要将分配放置在1GB的大型内存区域中以获得足够的空间,这就是这个算法所做的。