#boost #shared-ptr #smart-pointers
#boost #общий ptr #интеллектуальные указатели
Вопрос:
У меня проблема с boost shared_ptr. Время инициализации интеллектуального указателя в цикле увеличивается после первой итерации. Первая итерация занимает 40 мс. Каждая вторая итерация занимает около 400 мс. Я понятия не имею, почему это происходит. Я проверил, и утечек памяти нет, и все деструкторы вызваны. У кого-нибудь есть решение этого случая?
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;
}
Комментарии:
1. не могли бы вы уточнить: «Инициализация интеллектуального указателя в цикле увеличивается после первой итерации». ?? Какая инициализация? Количество ссылок? Что?
2. время первой итерации в цикле составляет около 40 мс, второй и остальных — около 400 мс
3. Я только что провел тест и не могу понять, почему время увеличивается.
Ответ №1:
clock()
ужасный счетчик времени. при этом вы едва можете считать миллисекунды. используйте monotic_clock или get_time_of_day. Или QueryPerformanceCounter, если вы используете Windows.
Далее, этот тест не проверяет время построения shared_ptr, он измеряет в основном время выделения объекта A
. В shared_ptr
самом ptr также есть выделение для хранения количества ссылок.
используйте make_shared
функцию (вместо shared_ptr(new A)
), чтобы ускорить все это примерно в 2 раза.