2011-04-19 46 views
0

我对boost shared_ptr有问题。循环中智能指针的初始化时间在第一次迭代后增加。 第一次迭代需要40毫秒。每隔一次迭代大约需要400毫秒。 我不知道为什么会发生。我查了一下,没有内存泄漏,所有的析构函数都被调用。有没有人有这种情况下的解决方案?为什么它看起来像boost :: shared_ptr结构变得越来越慢?

PS。但是,当我使用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; 
} 

+0

的一个因素,你可以澄清:“循环中的智能指针的初始化是在第一次迭代后增加了。” ??什么初始化?参考计数?什么? – 2011-04-19 08:22:08

+0

循环中的第一次迭代时间约为40毫秒,其他时间约为400毫秒 – user713782 2011-04-19 08:28:15

+0

您想做什么? – 2011-04-19 08:32:31

回答

0

clock()是一个可怕的时间计数器。你几乎可以用毫秒来计算。使用monotic_clock或get_time_of_day。或者QueryPerformanceCounter,如果你在Windows上。

接下来,此测试未测试shared_ptr构建时间,它主要测量对象A的分配时间。 shared_ptr本身也有一个分配来存储参考计数。

使用make_shared(而不是shared_ptr(new A))功能,以加快这一切,由约2