我有一个类,长这样:
typedef std::list<char*> PtrList;
class Foo
{
public:
void DoStuff();
private:
PtrList m_list;
PtrList::iterator m_it;
};
函数DoStuff()
的基本作用是在m_list
中添加元素或删除元素,找到它里面特定元素的迭代器并将其存储在m_it
中。需要注意的是每次调用DoStuff()
时,都会使用m_it
的值。那么问题出在哪里呢?虽然一切正常,但是性能分析显示由于
DoStuff()
中的list::push_back()
操作,导致new
操作符被过度调用。为了提高性能,我想在初始化
Foo
时为m_list
预分配内存,就像对std::vector
这样的容器所做的那样。但这样做会引入新的问题,例如:1. 元素的
insert
和erase
操作更加低效。
2. 由于从一个DoStuff()
调用到下一个调用期间,向量可能已经被修改,因此m_it
变得无效。 (Alan Stokes建议使用索引而不是迭代器来解决此问题。)我的解决方案是:实现一个对象池,可以拥有链表的功能。这样,我就可以获得一个链表,并且可以预先分配内存。这是我能想到的最简单的解决方案。
如果有标准的解决方案存在,我宁愿不要“重新造轮子”,而是使用标准解决方案。
欢迎提出任何想法、解决办法或启发性的评论!
vector
是否能够更好地执行?它很可能会;快速分配和良好的缓存行为通常可以弥补插入/删除成本。 - Alan StokesAllocator
(作为list
模板的第二个参数),并使用它从你的池中分配内存。你可能会发现boost::pool
很有用。 - Alan Stokesvector
中,以避免无效? (在插入和删除时要小心。) - Alan Stokes