快速删除指针STL向量的条目

时间:2013-11-11 19:03:28

标签: c++ pointers vector stl stdvector

我有一个我想要删除的指针向量,但迭代向量并为每个元素调用delete非常慢。有更快的方法吗?

不幸的是我真的需要存储指针,因为我使用虚拟超类。简化后,类结构看起来像这样:

class VirtualSuperClass
{
protected:
    SomeType m_someMember;
    // ...
public:
    virtual void doSomething() = 0;
};

class Subclass_1 : public VirtualSuperClass
{
protected:
    SomeType m_someSubclassMember;
    // ...
public:
    virtual void doSomething() { /* do something*/ }
};

class Subclass_2 : public VirtualSuperClass
{
protected:
    SomeType m_someOtherSubclassMember;
    // ...
public:
    virtual void doSomething() { /* do something else*/ }
}

在我的main方法中,我填充了超类的指针向量,并为每个元素调用函数doSomething()

int main()
{
    std::vector<VirtualSuperClass*> vec;
    vec.push_back(new Subclass_1());
    vec.push_back(new Subclass_2());
    vec.push_back(new Subclass_2());
    vec.push_back(new Subclass_1());
    // and so on, about 40,000 elements (not really done with .push_back :) ) ...

    // this actually runs in an application loop
    for (size_t i = 0; i < vec.size(); i++)
    {
        vec[i]->doSomething();
    }

    // ...

    for (size_t i = 0; i < vec.size(); i++)
    {
        delete vec[i];     // <-- pretty slow for large number of elements
        vec[i] = NULL;
    }
    vec.clear();
    return 0;
}

3 个答案:

答案 0 :(得分:6)

任何正确的解决方案都将归结为在每个指针上执行delete。既然您已经分析了代码并将其识别为瓶颈,那么我会寻找一种将delete移动到另一个线程的解决方案。

这可以通过以下方式完成:

  1. 创建一个delete指针传递的工作线程
  2. 从向量中删除指针并将它们复制到另一个由工作线程
  3. 拥有的向量中
  4. 启动工作线程作业,让它删除指针
  5. 就纯CPU时间而言,这不会比你当前的解决方案更快(事实上,根据你的工作方式,它可能会更慢),但它会将繁重的工作从主线程中移除。

答案 1 :(得分:6)

您可能正在寻找的一件事是为您分配的类定制分配器 - 这样您就可以有效地获取和释放内存到系统的内存而不是微小的片段 - 它可能是改善“整体”的唯一解决方案没有修改它的这个系统的性能(这给你的瓶颈肯定是个好主意;)。)。

答案 2 :(得分:1)

可能提高性能的另一种方法是使用一种内存池,在其中预先分配一个大的原始缓冲区,然后在其中放置 - new每个单独的对象缓冲液中。

这有可能提高性能,因为尽管你仍然必须销毁每个指针,但是通过直接调用析构函数而不是delete来完成破坏。这样可以避免不得不转到系统的内存管理器,而避免是潜在的性能提升所在。

然而,这种方法有一些重要的注意事项,除了最极端的情况外,我不会推荐它。需要注意的是,你要对自己负责管理自己的记忆。