我有一个boost shared_ptr的问题。智能指针在循环中的初始化时间在第一次迭代后增加。第一次迭代耗时40毫秒。每隔一次迭代大约需要400毫秒。我不知道为什么会这样。我检查过了,没有内存泄漏,所有析构函数都被调用了。有人能解决这个问题吗?
p。然而,当我使用boost::ptr_vector时,时间不会增加(但只在调试版本:))。
看到的例子:
class A;
typedef boost::shared_ptr<A> A_ptr;
class A
{
public:
A(){}
A_ptr add(A* new_A)
{
A_ptr new_A_ptr( new_A );
children.push_back(new_A_ptr);
return new_A_ptr;
}
~A(){}
vector<A_ptr> children;
};
void test()
{
A_ptr root_ptr( new A() );
for (int k=0; k<200; k++)
{
A_ptr sub_ptr = root_ptr->add( new A() );
for (int l=0; l<100; l++) sub_ptr->add( new A() );
}
};
int main()
{
for(int i=0; i<10; i++)
{
unsigned t = clock();
test();
std::cout<<"elapsed: "<<clock()-t<<std::endl;
}
return 0;
}
clock()
是一个糟糕的时间计数器。你几乎不能用它计算毫秒数。使用monotic_clock或get_time_of_day。或者QueryPerformanceCounter(如果你在windows上)
接下来,这个测试不是测试shared_ptr的构建时间,它主要是测量对象A
的分配时间。shared_ptr
本身也有一个分配来存储refcount。
使用make_shared
函数(而不是shared_ptr(new A)
)来加速所有这些,大约是2倍。