рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
рдпрд╣ рдЖрд▓реЗрдЦ рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╡рд╛рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрдВрдЯреЗрдирд░ (рдкреБрд╢_рдмреИрдХ)
рднрд░рдиреЗ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдЬрдЯрд┐рд▓ рд╣реИ, рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди, рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛, рдПрдХ рдХрдВрдЯреЗрдирд░ рднрд░рдирд╛, рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░рдирд╛ рдФрд░ рдорд╛рдирдХ рдбрд┐рд▓реАрдЯ рдСрдкрд░реЗрдЯрд░ред рдорд╛рдирдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рддреАрди рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рд╡реЗрдХреНрдЯрд░, рд╕реВрдЪреА, рдбреАрдХреЗрдИ, рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ - рдПрд╕рдЯреАрдбреА :: рд╕рд╛рдЭрд╛_рдкреНрд░рдЯреА, рдПрд╕рдЯреАрдбреА :: рдСрдЯреЛ_рдкреНрд░реЗрдЯ рдФрд░ рдПрдХ рд╕рд░рд▓ рдкреЙрдЗрдВрдЯрд░ред рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ (рдЬреЛ рд╕рдВрдХреЗрдд рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗ) рд▓рдВрдмреЗ, рдПрд╕рдЯреАрдбреА :: рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдЪрд╛рд░, рдПрдХ рдордирдорд╛рдирд╛ рд╡рд░реНрдЧред
рдЯреЗрд╕реНрдЯ рд╡рд┐рд╡рд░рдг
рд╕реНрд░реЛрдд рдХреЛрдб рдПрдордПрд╕ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2010 рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд▓рдВрдмреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдмрддрд╛ рджреЗрдВ рдХрд┐ рдХреБрдЫ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рдЯреА рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИред
рдирд┐рд░реНрдорд╛рддрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдЧрд╛, рдФрд░ рдкрд╛рд░рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░реЗрдЧрд╛ред рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкрддреЗ рдкрд░ рд╕реНрдерд┐рдд рдореВрд▓реНрдп рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХрд░реЗрдЧрд╛, рд╕рд╛рде рд╣реА рдЗрд╕рдХрд╛ рдирд╛рдо рдФрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЬреАрд╡рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
template< class T, typename Type > class test_type_and_smart_pointer { public: test_type_and_smart_pointer( std::string const& val, bool msg, Type type_val ) : _msg( msg ), _name( val ) { if( _msg ) std::cout << "created " << _name << std::endl; x.reset( new Type ); *x = type_val; } ~test_type_and_smart_pointer() { if( _msg ) std::cout << "deleted " << _name << std::endl; } test_type_and_smart_pointer(const test_type_and_smart_pointer & W) { if( W._msg ) std::cout << "copied " << W._name << std::endl; this->x.reset( new Type ); *(this->x) = *(Wx); this->_name = W._name; this->_msg = W._msg; } private: T x; bool _msg; std::string _name; };
рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдХрд▓реНрдк:
- рдХреНрд▓рд╛рд╕ рдЯреА - рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдирд┐рд╣рд┐рдд рд╡рд░реНрдЧ,
- typename Type - рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБ рдХрд╛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ред
Test_type_and_smart_pointer рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп:
- T x - рд╕реВрдЪрдХ рд╕реНрд╡рдпрдВ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП,
- рдмреВрд▓ _msg - рд╕реВрдЪрдирд╛ рд╕рдВрджреЗрд╢ рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ,
- std :: string _name рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБ рдХрд╛ рдирд╛рдо рд╣реИред
рдпрджрд┐ рдХреЗрд╕ рдЯрд╛рдЗрдк рдЯреВ рд╕реНрдЯреИрдВрдбрд░реНрдб рд╣реИ рддреЛ рдкреЙрдЗрдВрдЯрд░ рдЯреА рдХреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВред
template< class T, typename Type > class test_type_and_simple_pointer { public: test_type_and_simple_pointer( std::string const& val, bool msg, Type type_val ) : _msg( msg ), _name( val ) { if( _msg ) std::cout << "created " << _name << std::endl; x = new Type; *x = type_val; } ~test_type_and_simple_pointer() { delete x; if( _msg ) std::cout << "deleted " << _name << std::endl; } test_type_and_simple_pointer(const test_type_and_simple_pointer & W) { if( W._msg ) std::cout << "copied " << W._name << std::endl; this->x = new Type( *(Wx) ); this->_name = W._name; this->_msg = W._msg; } private: T x; bool _msg; std::string _name; };
рдЕрдм рд╣рдореЗрдВ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рддреЗ рд╣реИрдВ:
template< typename _Ptr, typename T, typename Container, bool msg > void test_smart_ptr( bool big_data, T val ) { using namespace std; test_type_and_smart_pointer< _Ptr, T > x( "a001", msg, val ); test_type_and_smart_pointer< _Ptr, T > x2( x ); Container cnt; cnt.push_back( x ); cnt.push_back( x2 ); if( big_data ) for( int i = 0; i <= 100; i++ ) { test_type_and_smart_pointer< _Ptr, T > xx( "a002", msg, val ); test_type_and_smart_pointer< _Ptr, T > xx2( xx ); cnt.push_back( xx ); cnt.push_back( xx2 ); } cnt.clear(); } template< typename T, typename Container, bool msg > void test_simple_ptr( bool big_data, T val ) { using namespace std; test_type_and_simple_pointer< T*, T> x( "b001", msg, val ); test_type_and_simple_pointer< T*, T> x2( x ); Container cnt; cnt.push_back( x ); cnt.push_back( x2 ); if( big_data ) for( int i = 0; i <= 100; i++ ) { test_type_and_simple_pointer< T*, T> xx( "b002", msg, val ); test_type_and_simple_pointer< T*, T> xx2( xx ); cnt.push_back( xx ); cnt.push_back( xx2 ); } cnt.clear(); }
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпреЗ рдлрд╝рдВрдХреНрд╢рди рджреЛ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ: рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдмрдирд╛рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд░рдЦрдирд╛, рдФрд░ рдЪрдХреНрд░реАрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдмрдирд╛рдирд╛ рдФрд░ рдХрдВрдЯреЗрдирд░ рдХреЛ рднрд░рдирд╛ред
Test_smart_ptr рдФрд░ test_simple_ptr рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╕рдордп _time_est рджреНрд╡рд╛рд░рд╛ рдорд╛рдкрд╛ рдЬрд╛рдПрдЧрд╛:
double _time_test( std::function< void() > test_func, unsigned int times ) { using namespace std; double start = 0, end = 0; start = GetTickCount(); for( unsigned int i = 0; i < times; i++ ) { test_func(); } end = GetTickCount() - start; //cout << "Elapsed ms: " << end << // " for " << times << " times " << endl; return end; }
рдЖрд╡рд╢реНрдпрдХ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВ:
#include #include #include #include #include #include <Windows.h> #include
рдПрдХ рдордирдорд╛рдирд╛ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ, рдЧрддрд┐рд╢реАрд▓ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреЗ рдмрд┐рдирд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
class some_obj { public: some_obj() { i = 90000; s = "1231231231231231231232"; d = 39482.27392; } ~some_obj() { } private: int i; std::string s; double d; };
рддреЛ, рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред 72 рд▓рдВрдмреЛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдвреЗрд░ рдХреЛ рдЙрд╕рдХреА рдореВрд▓ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛рддрд╛ рд╣реИред
int main() { using namespace std; const long long_val = 900000000; const char ch = 'a'; const string str = "abc"; /////////////////////////////////////////////////////////////////////////////////////////////////////// auto f_01 = [&]() -> void { test_smart_ptr< shared_ptr< long >, long, vector< test_type_and_smart_pointer< shared_ptr< long >, long > >, false >( false, long_val ); }; auto f_02 = [&]() -> void { test_smart_ptr< shared_ptr< char >, char, vector< test_type_and_smart_pointer< shared_ptr< char >, char > >, false >( false, ch ); }; auto f_03 = [&]() -> void { test_smart_ptr< shared_ptr< string >, string, vector< test_type_and_smart_pointer< shared_ptr< string >, string > >, false >( false, str ); }; auto f_04 = [&]() -> void { some_obj x; test_smart_ptr< shared_ptr< some_obj >, some_obj, vector< test_type_and_smart_pointer< shared_ptr< some_obj >, some_obj > >, false >( false, x ); }; ... _time_test( f_01, 100000 ); _time_test( f_02, 100000 ); _time_test( f_03, 100000 ); _time_test( f_04, 100000 ); ... return 0; }
рдореБрдЦреНрдп рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб рдмреЛрдЭрд┐рд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдЭрд╛_рдкрд╛рд░реНрдЯрд░ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд╣рд▓реЗ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЯреЗрдореНрдкрд▓реЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╡реГрддреНрддрд┐ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ f_nn рдлрд╝рдВрдХреНрд╢рди рдХреЛ 15 рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдорд╛рдк рдкрд░рд┐рдгрд╛рдо рдФрд╕рдд рдерд╛ (рд▓реЙрдиреНрдЪ
рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рдиреАрдЪреЗ рд╕реЗ рд░рд┐рд▓реАрдЬ рдореЛрдб рдореЗрдВ рдерд╛)ред рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп, рдЕрд░реНрдерд╛рддреНред рдЕрдиреНрдп рдореВрд▓реНрдп рдЕрдиреБрдкрд╛рдд рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВред
рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо
рд░рдВрдЧ рд╕рднреА рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдмреАрдЪ
рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реВрдЪрдХ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░
рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ:

рд╕рднреА рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ
рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░:

рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдФрд░
рд╕рднреА рд╕рдВрдХреЗрддрдХреЛрдВ рдХреЗ рд▓рд┐рдП рднрд░рдиреЗ рдкрд░ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдХрдВрдЯреЗрдирд░:

рдХреНрдпрд╛ рд╕реАрдЦрд╛ рдЬрд╛рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ?
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдХрдВрдЯреЗрдирд░ рддреЗрдЬреА рд╕реЗ рднрд░ рд░рд╣рд╛ рд╣реИред
рджреВрд╕рд░реЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдЖрдиреБрдкрд╛рддрд┐рдХ рдЕрдиреБрдкрд╛рдд рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред