【发布时间】:2012-05-27 07:21:22
【问题描述】:
我有一个如下所示的课程:
typedef std::list<char*> PtrList;
class Foo
{
public:
void DoStuff();
private:
PtrList m_list;
PtrList::iterator m_it;
};
函数DoStuff() 基本上是向m_list 添加元素或从中删除元素,找到其中某个特殊元素的迭代器并将其存储在m_it 中。需要注意的是,m_it 的每个值都会在随后的每个 DoStuff() 调用中使用。
那么问题出在哪里?
一切正常,除了分析显示操作员 new 被调用过多,因为 list::push_back() 从 DoStuff() 调用。
为了提高性能,我想在 Foo 的初始化中为 m_list 预分配内存,就像它是 std::vector 一样。问题是这会引入新的问题,例如:
- 效率较低的
insert和erase元素。 -
只要向量从一个调用更改为
DoStuff()到下一个,m_it就会失效。 编辑: Alan Stokes 建议使用索引而不是迭代器来解决这个问题。
我的解决方案:我能想到的最简单的解决方案是实现一个对象池,该池还具有链表功能。这样我就得到了一个链表并且可以为它预分配内存。
是我遗漏了什么还是它真的是最简单的解决方案?我宁愿不“重新发明轮子”,而是使用标准解决方案(如果存在)。
任何想法、解决方法或有启发性的 cmets 都将不胜感激!
【问题讨论】:
-
你到底在用那些 char* 做什么?
-
@ScarletAmaranth 这些是指向内存中存储数据包的位置的指针(我将其简化为 char* 问题)。
-
你有没有检查过如果你只使用
vector,它是否真的表现得更好?它可能会很好;快速分配和良好的缓存行为通常可以弥补插入/删除成本。 -
您可以指定自定义
Allocator(list模板的第二个参数)并使用它从您的池中分配。您可能会发现boost::pool很有用。 -
@Eitan 您能否将索引而不是迭代器存储到
vector中以避免失效? (插入和删除时要小心。)