所以我的代码使用了一个tr1::unordered_map<int, ContainerA>
where 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 替换为 ContainerA 对象,并将 unordered_map 替换为指针tr1::unordered_map<int, ContainerA*>
。
这对我来说似乎是个好主意,但是在做了一些研究之后,在我看来这种方法并不常见,这就是为什么我想知道我是否遗漏了什么。
除了指针的额外内存开销之外,这种方法是否有任何缺点?
编辑:正如下面的评论所指出的,问题可能出在我的内存分配上。我按如下方式分配我的内存:我ContainerA
使用它的构造函数构造一个对象ContainerA obja(int* type, int test)
。在这个阶段,ContainerA
构造函数让objectB
数组和vector<int>
数组得到默认构造。
构建完 my ContainerA
, all myvector<int>
并objectB
需要在堆上分配一些内存。这可能是耗时的阶段。
在不使用指向指针的情况下,可能可以避免重新分配和重新分配内存unordered_map
,而是按照建议的方式简单地交换内存内容。但是,我需要某种方式来跟踪哪些对象不再使用,这听起来比切换到指针数组更乏味?