mad*_*n45 3 c++ pointers stl vector 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*/ }
}
Run Code Online (Sandbox Code Playgroud)
在我的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;
}
Run Code Online (Sandbox Code Playgroud)
任何正确的解决方案都将归结为delete对每个指针执行操作.既然您已经分析了代码并将其识别为瓶颈,那么我会寻找一种将其转移delete到另一个线程的解决方案.
这可以通过以下方式完成:
delete传入指针的工作线程就纯CPU时间而言,这不会比你当前的解决方案更快(事实上,根据你的工作方式,它可能会更慢),但它会将繁重的工作移出你的主线程.
您可能正在寻找的一件事是为您分配的类定制分配器 - 这样您可以有效地获取和释放内存到系统的内存,而不是微小的片段 - 它可能是提高此"整体"性能的唯一解决方案系统没有修改它(这给你的瓶颈肯定看起来是个好主意;)).
| 归档时间: |
|
| 查看次数: |
966 次 |
| 最近记录: |