1

所以我的代码使用了一个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,而是按照建议的方式简单地交换内存内容。但是,我需要某种方式来跟踪哪些对象不再使用,这听起来比切换到指针数组更乏味?

4

0 回答 0