所以我的代码使用tr1::unordered_map<int, ContainerA>
,其中ContainerA是这样的:
class ContainerA
{
int* _M_type;
unsigned int _M_check;
int _M_test;
unsigned int _M_any;
index _M_index;
index _M_newindex;
objectB _M_cells[10];
vector<int> _M_mapping[10];
}
我的unordered_map中的条目数量达到数百万,并且在每个时间步骤中,数万个(如果不是数十万个)条目被删除并添加。似乎我的大部分计算时间用于单独分配ContainerA类的每个实例。
我建议加快速度的解决方案是动态分配开始时所需的估计数量的ContainerA对象,并将unordered_map替换为unordered_map到指针tr1::unordered_map<int, ContainerA*>
。
这对我来说似乎是一个好主意,但是在做了一些研究之后,我觉得这种方法并不常见,这就是为什么我想知道我是否遗漏了什么。
除了指针的额外内存开销外,这种方法还有什么缺点吗?
编辑:
正如下面的评论所指出的,问题可能在于我的内存分配。我按如下方式分配内存:
我使用其构造函数ContainerA
构造了一个ContainerA obja(int* type, int test)
对象。在此阶段,ContainerA
构造函数允许objectB
数组和vector<int>
数组默认构造。
构建我的ContainerA
后,我的所有vector<int>
和objectB
都需要在堆上分配一些内存。这可能是一个耗时的阶段。
可能有可能避免在不使用unordered_map
指针的情况下释放和重新分配内存,而是按照建议简单地交换内存内容。但是,我需要有某种方法来跟踪哪些对象不再使用,这听起来比切换到指针数组更乏味?