预分配清单

时间:2015-02-17 15:56:33

标签: c++ memory-management allocator

我有两个对象列表

list<QC> qcB;
list<QC> qcS;

并使用emplace_back()将项目插入其中。因为我意识到插入这些项目花了太长时间,所以我开始搜索我从未使用过的分配器,看看我是否能够让事情变得更快。我在某处读到了我能够获得列表的默认分配器,并提前在其上分配空间,所以我尝试在其中一个列表中分配空间:

qcB.get_allocator().allocate(100000);

我不确定这是否应该起作用,但事实是emplace_back()与两个列表的时间相同,即使其中一个事先正在分配空间。

这应该有效吗?这应该以不同的方式完成,而不是尝试在默认分配器中分配空间吗?我不时清理列表,这可能会影响分配的空间吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果您正在谈论标准库list,它通常是链接列表算法或类似的。

假设您已经完成了良好的分析并且插入确实是问题,并假设您只想进行emplace_back次呼叫。然后使用vector,这样您就可以拨打reserve,并且可以提高性能。

vector<QC> qcB;
qcB.reserve(10000);

但我担心你的实际瓶颈是对象QC初始化,而这不能是reserve d。在这种情况下,您可以预先初始化对象(如果有意义初始化对象然后将实际数据放入其中)。

像这样(快速和肮脏的草稿):

vector<QC> qcB;
qcB.resize(10000);

for (int i = 0; i < 10000; ++i) {
    qcB[i].populate_object();
}