рдореИрдВ C ++ рдореЗрдВ рдЕрдкрдиреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреА рдПрдХ рдФрд░ рдмрд╛рдЗрдХ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдПрдХ рд╕рд╛рдЗрдХрд┐рд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдмрдирд╛ рдФрд░ рдЬрд╛рд░реА рдХрд░ рд╕рдХрддреА рд╣реИред рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдирдИ рдХреЗ рд╕рд╛рде рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 30% рддреЗрдЬреА рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ (рд╡рд╛рдкрд╕ рди рдХрд░рдиреЗ) рдХреА рдЧрддрд┐ рдорд┐рд▓рддреА рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд▓ рдХреЛрдИ рдирдИ рдЪреАрдЬ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ - рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреНрдпреЛрдВ рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ - рд╡рд┐рд╡рд░рдг рдореЗрдВ рдореБрдЦреНрдп рдмрд╛рддред
рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рд╕реА ++ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореБрдЭреЗ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЫреЛрдЯреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓реЗ рдЬрд╛рдирд╛ рдкрдбрд╝рд╛ред рдЙрдиреНрд╣реЗрдВ рдХреНрдпрд╛ рдЬрд░реВрд░рдд рдереА, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдвреЗрд░ рдкрд░ред рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╡рд░реНрдгрди рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреБрдЫ рднреА рдирд╣реАрдВ рдереЗред рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ 4x4 рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЯрд╛рдЗрдк рдбрдмрд▓ рдФрд░ рдХрдИ рд╕рд╣рд╛рдпрдХ рдЪрд░ рдереЗред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░реВрдк рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрдЧ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрд░рдЪрдирд╛) рдХрд╛ рд░реВрдк рд╣реИ:
struct Position{ double m[16]; int s; }
рд╡рд╣ рд╣реИ - рд▓рдЧрднрдЧ 132 рдмрд╛рдЗрдЯреНрд╕ред
рдХрдИ рддрд░реАрдХреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХреЗрд╡рд▓ рдирдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рд╕рд╣рд┐рдд, рдореИрдВ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдорд╛рдереЗ рдкрд░ рд╕реАрдзреЗ рдирдП рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рди рдСрдкрд░реЗрд╢рди рд╣реИред
рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░реЗрдВ рдЬреЛ
рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд╕рд╛рде, рдФрд░ рдЙрдирдХреЗ рдЬреИрд╕реЗ рдЕрдиреНрдп рд▓реЛрдЧ рдореБрдЭреЗ рдмрд╣реБрдд рджреВрд░ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╢рд╛рдпрдж рдореИрдВ рдпрд╣рд╛рдВ рдПрдХ рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдлрд┐рд░ рднреА, рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдРрд╕реА рдмрд╛рдд рдирд╣реАрдВ рдорд┐рд▓реА (рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЗрд╕ рддрдереНрдп рд╕реЗ рдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП), рд▓реЗрдХрд┐рди рдЬреЛ рдмрд╣реБрдд рдЬрд▓реНрджреА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛ред
рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд▓ рдХрд╛рдлреА рдкреНрд░рд╕рд┐рджреНрдз рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдкреИрдЯрд░реНрдиред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрдЯрд┐рд▓ рд╣реИ - рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рдвреЗрд░ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рджреЗрдВред рдЬрдм рд╕рдм рдХреБрдЫ рд╕реМрдВрдк рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЕрдзрд┐рдХ рдмрдирд╛рдПрдБред рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕реЗ рдореБрдХреНрдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдвреЗрд░ рдкрд░ рд▓реМрдЯрд╛ рджреЗрдВред рдпрд╣рд╛рдБ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
template <typename T, unsigned int chunk_size = 100> class Factory { public: inline T* get(){ if(free_ptrs.empty()){ makeMore(); } T* obj = free_ptrs.back(); free_ptrs.pop_back(); return obj; } inline void free(T* obj){ free_ptrs.push_back(obj); } private: std::vector<T> buffer; std::vector<T*> free_ptrs;
рдЖрд╡реЗрджрди:
Factory<Position> pool; pool.get();
рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдзрд┐ рдХреЗ рдиреБрдХрд╕рд╛рдиреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
- рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдвреЗрд░ рдореЗрдВ рдЫреЛрдЯреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ (10,000 - 1,000,000) рдХреЗ рдирд┐рд░реНрдорд╛рдг рдиреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЧрд┐рд░рд╛рд╡рдЯ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ред рдмреЗрд╢рдХ, рдХрд╛рдо рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдареЛрдХрд░реЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рд╣реА рджреЗрдЦреА рдЬрд╛рдПрдВрдЧреАред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреАред рдЕрдЧрд░ рдЖрдк рдЕрдЪреНрдЫрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ?
- рдмрдирд╛рдИ рдЧрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!
- рд╡рд╕реНрддреБ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд▓реМрдЯрддреА рд╣реИред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ / рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЙрд▓ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХред
рдпрд╣ рджреЗрдЦрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рджреЗрд╢реА рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
T* array = new T[];
рдФрд░ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛, рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ STL'ny рдХреЛ рдмрдлрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рд╕рд░рдгреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде, рдПрдХ рдирдпрд╛ рджреЗрд╢реА рд╕рд░рдгреА рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рджреНрд╡рд╛рд░рд╛ рдЕрдиреНрдп рд╕рднреА рдореМрдЬреВрджрд╛ рддрддреНрд╡реЛрдВ рдореЗрдВ рдХреЙрдкреА / рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╣ рд╣реИ - рдпрджрд┐ рд╣рдо рдЕрдкрдиреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡рд░реНрдЧ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рддреЛ рдпрд╣ рдмрд╣реБрдд рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рддреЛ - рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрдлрд╝рд░реНрд╕ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкреВрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ:
template <typename T, unsigned int chunk_size = 100> class Factory { public: inline T* get(){ if(free_ptrs.empty()){ makeMore(); } T* obj = free_ptrs.back(); free_ptrs.pop_back(); return obj; } inline void free(T* obj){ free_ptrs.push_back(obj); } private: struct Buffer{ T* array; int size; Buffer(int num = chunk_size){ array = new T[num]; size = num; } Buffer(Buffer&& other) noexcept{ size = other.size; array = other.array; other.array = nullptr; } ~Buffer(){ if (array != nullptr){ delete []array; } } }; std::vector<Buffer> buffers; std::vector<T*> free_ptrs; void makeMore(){ buffers.emplace_back(chunk_size); Buffer &buf = buffers.back(); for (int i = 0; i < buf.size; ++i) { free_ptrs.emplace_back(&buf.array[i]); } } };
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдмрдлрд░ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИред рд╣рдореЗрдВ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрдм std :: рд╡реЗрдХреНрдЯрд░ рд╕рд░рдгреА рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИред
рдирддреАрдЬрддрди, рдкреВрд▓ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХрдХрд░рдг рд▓рдЧрднрдЧ рдХрд╛рдлреА рддреЗрдЬ рд╣реЛ рдЧрдпрд╛ред
рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢ -
рдирдИ рдХрдорд╛рдВрдб рдХреА рд╡рд┐рд╡рд┐рдзрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдмреБрд▓рд╛рддреЗ рд╣реИрдВред рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ "рдЧрдВрджрд╛ рдирд╣реАрдВ" рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдпрд╣ рд╣рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдкрд░рд┐рдгрд╛рдо template <typename T, unsigned int chunk_size = 100> class PoolFactory { public: template<typename... Args> inline T* get(Args&&...args){ T* obj = getRaw(); new (obj) T(args...); return obj; } inline T* getRaw(){ if(free_ptrs.empty()){ makeMore(); } T* obj = free_ptrs.back(); free_ptrs.pop_back(); return obj; } inline void free(T* obj){ free_ptrs.push_back(obj); } inline void clearPool(){ buffers.clear(); free_ptrs.clear(); } void freeAll(){ free_ptrs.clear(); int buf_count = buffers.size(); for (int buf_id = 0; buf_id < buf_count; ++buf_id) { Buffer &buf = buffers[buf_id]; for (int i = 0; i < buf.size; ++i) { free_ptrs.emplace_back(&buf.array[i]); } } } private: struct Buffer{ T* array; int size; Buffer(int num = chunk_size){
рдореЗрд░реЗ рд▓рд┐рдП, рдореБрдЦреНрдп рдХрд╛рд░реНрдп, рдЗрди рдЫреЛрдЯреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдЬрд▓реНрджреА рд╕реЗ std :: рд╡реЗрдХреНрдЯрд░ рдХреЛ рднрд░рдирд╛ рдерд╛ред рдЙрд╕ рд╕реЗ, рдкрд░реАрдХреНрд╖рдг рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреВрд▓ рдФрд░ emplace_back рдХреЗ рд╕рд╛рде рднрд░рдг рд╕рдордп рд╕рдорд╛рди рд╣реИред рдкреВрд▓ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп - рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдкреВрд▓ рдЬреАрддрддрд╛ рд╣реИред
рдкрд░реАрдХреНрд╖рдг class BaseClass { public: BaseClass(){} BaseClass(int value){ s = value; } int getS(){ return s; } int s; int m[16]; }; std::vector< BaseClass > ar; std::vector< BaseClass* > ptr_ar; const unsigned int total = 1000000; int main(int argc, char *argv[]) { PoolFactory<BaseClass> bPool; ar.reserve(total); timer.start(); for (int var = 0; var < total; ++var) { ar.emplace_back(var); } qDebug()<<"1 : "<<timer.elapsed(); ptr_ar.clear(); ptr_ar.reserve(total); timer.start(); for (int var = 0; var < total; ++var) { ptr_ar.push_back(bPool.get(var)); } qDebug()<<"2 : "<<timer.elapsed(); bPool.freeAll(); ptr_ar.clear(); ptr_ar.reserve(total); timer.start(); for (int var = 0; var < total; ++var) { ptr_ar.push_back(bPool.get(var)); } qDebug()<<"3 : "<<timer.elapsed(); ptr_ar.clear(); ptr_ar.reserve(total); timer.start(); for (int var = 0; var < total; ++var) { ptr_ar.push_back(new BaseClass(var)); } qDebug()<<"4 : "<<timer.elapsed(); }
рдирд┐рд╖реНрдХрд░реНрд╖:
1: 21
2: 22
3: 5
4: 37
рдмрд┐рдирд╛ рд░рд┐рдЬрд░реНрд╡:
1: 135
(рднрд░реЗ рдЬрд╛ рд░рд╣реЗ рдмреЗрд╕рдХреНрд▓рд╛рд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреА рдХрдореА рдХрд╛ рдЕрд╕рд░ рд╣реИ)2: 22
3: 4
4: 38