рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди



рдкрд░рд┐рдЪрдп


рдлрд┐рд▓рд╣рд╛рд▓, рдПрдХ рдереНрд░реЗрдб рдкрд░ рдЪрд▓ рд░рд╣реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред рдмреЗрд╢рдХ, рдХрдИ рд╕рд░рд▓ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдПрдХ рдзрд╛рдЧрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реЗ рджреВрд░ рд╣реИ рдФрд░ рдордзреНрдпрдо рдпрд╛ рдЙрдЪреНрдЪ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдп рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред рд╕реНрдкрд╖реНрдЯ рд╕рд╛рджрдЧреА рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рдХрдИ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░рд╢реНрди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рдпреЛрдЧреНрдп рд╣реИред рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХрд┐ рд╕рд┐рдВрдЧрд▓рдиреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд╕рд╛рде рд╣реА рдЙрдирдХрд╛ рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрди рдореБрджреНрджреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕рд┐рдВрдЧрд▓рдЯрди [1] , [2] , [3] рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рднрд┐рдиреНрди рдореБрджреНрджреЛрдВ рдкрд░ рдЕрдкрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рдпрд╣ рдЖрд▓реЗрдЦ рдПрдХрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рдкреНрд░рднрд╛рд╡ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдЖрдиреЗ рд╡рд╛рд▓реЗ рдореБрджреНрджреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛ред

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди


рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

template<typename T> T& single() { static T t; return t; } 

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╕реАрдзрд╛ рд╣реИ: рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреА рдХреЗ рд▓рд┐рдП рд╣рдо рдорд╛рдВрдЧ рдкрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред "рдЖрд▓рд╕реА", рдФрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 1 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рд╣рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдЬреАрд╡рдирдХрд╛рд▓ рдФрд░ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╣рдорд╛рд░реЗ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ 2 рдпрд╛ рдЕрдзрд┐рдХ рдзрд╛рдЧреЗ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреА рдХреЗ рд╕рд╛рде рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рд╕реА ++ рдорд╛рдирдХ


рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдкрд╣рд▓реВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░реЗрдВ, рдЕрд░реНрдерд╛рддред C ++ рдорд╛рдирдХ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ 2 рдорд╛рдирдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ: 2003 рдФрд░ 2011ред

$ 6.7.4, рд╕реА ++ 03

рд╕реНрдерд┐рд░ рднрдВрдбрд╛рд░рдг рдЕрд╡рдзрд┐ (3.7.1) рдХреЗ рд╕рд╛рде рд╕рднреА рд╕реНрдерд╛рдиреАрдп рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╢реВрдиреНрдп-рдЖрд░рдВрднреАрдХрд░рдг (8.5) рдХрд┐рд╕реА рдЕрдиреНрдп рдЖрд░рдВрднреАрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдереИрддрд┐рдХ рднрдВрдбрд╛рд░рдг рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде POD рдкреНрд░рдХрд╛рд░ (3.9) рдХреА рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╡рд╕реНрддреБ рд╕реНрдерд┐рд░-рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд рд╣реЛрддреА рд╣реИ, рдЬрдм рдЗрд╕рдХрд╛ рдмреНрд▓реЙрдХ рдкрд╣рд▓реЗ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЕрдиреНрдп рд╕реНрдерд╛рдиреАрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕реНрдереИрддрд┐рдХ рднрдВрдбрд╛рд░рдг рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рдЙрдиреНрд╣реАрдВ рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд рдЬрд┐рдиреНрд╣реЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рд╣реИ рдХрд┐ рд╡реЗ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рд╕реНрдереИрддрд┐рдХ рднрдВрдбрд╛рд░рдг рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде рдирд╛рдорд╕реНрдерд╛рди рд╕реНрдХреЛрдк (3.6.2) рдореЗрдВ рд╕реНрдерд┐рд░ рдХрд░ рд╕рдХреЗрдВред рдЕрдиреНрдпрдерд╛ рдРрд╕реА рд╡рд╕реНрддреБ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдкрд╣рд▓реА рдмрд╛рд░ рдирд┐рдпрдВрддреНрд░рдг рдЙрд╕рдХреА рдШреЛрд╖рдгрд╛ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ; рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд╕реНрддреБ рдХреЛ рдЗрд╕рдХреЗ рдЖрд░рдВрдн рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдЖрд░рдВрднрд┐рдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдиреЗ рд╕реЗ рдЖрд░рдВрднреАрдХрд░рдг рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рддреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рдПрдЧреА рдХрд┐ рдЕрдЧрд▓реА рдмрд╛рд░ рдирд┐рдпрдВрддреНрд░рдг рдШреЛрд╖рдгрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рдЬрд╛рдПред рдпрджрд┐ рдирд┐рдпрдВрддреНрд░рдг рдШреЛрд╖рдгрд╛ (рдкреБрдирд░рд╛рд╡рд░реНрддреА) рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред

$ 6.7.4, рд╕реА ++ 11

рд╕реНрдерд┐рд░ рд╕рдВрдЧреНрд░рд╣рдг рдЕрд╡рдзрд┐ (3.7.1) рдпрд╛ рдереНрд░реЗрдб рд╕реНрдЯреЛрд░реЗрдЬ рдЕрд╡рдзрд┐ (3.7.2) рдХреЗ рд╕рд╛рде рд╕рднреА рдмреНрд▓реЙрдХ-рд╕реНрдХреЛрдк рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рд╢реВрдиреНрдп-рдЖрд░рдВрднреАрдХрд░рдг (8.5) рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдереИрддрд┐рдХ рднрдВрдбрд╛рд░рдг рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдмреНрд▓реЙрдХ-рд╕реНрдХреЛрдк рдЗрдХрд╛рдИ рдХреА рдирд┐рд░рдВрддрд░ рдЖрд░рдВрднреАрдХрд░рдг (3.6.2), рдпрджрд┐ рд▓рд╛рдЧреВ рд╣реЛ, рддреЛ рдЗрд╕рдХреЗ рдмреНрд▓реЙрдХ рдХреЛ рдкрд╣рд▓реЗ рджрд░реНрдЬ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реНрдерд┐рд░ рдпрд╛ рдереНрд░реЗрдб рд╕реНрдЯреЛрд░реЗрдЬ рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рдмреНрд▓реЙрдХ-рд╕реНрдХреЛрдк рд╡реИрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рдЙрдиреНрд╣реАрдВ рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдЬреЛ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╡реИрд░рд┐рдПрдмрд▓ рдпрд╛ рдереНрд░реЗрдб рд╕реНрдЯреЛрд░реЗрдЬ рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде рдирд╛рдорд╕реНрдерд╛рди рд╕реНрдХреЛрдк (3.6.2) рдореЗрдВ рд╡реИрд░рд┐рдПрдмрд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рдЕрдиреНрдпрдерд╛ рдРрд╕рд╛ рд╡реИрд░рд┐рдПрдмрд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдкрд╣рд▓реА рдмрд╛рд░ рдирд┐рдпрдВрддреНрд░рдг рдЕрдкрдиреА рдШреЛрд╖рдгрд╛ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ; рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЪрд░ рдХреЛ рдЗрд╕рдХреЗ рдЖрд░рдВрдн рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдиреЗ рд╕реЗ рдЖрд░рдВрднреАрдХрд░рдг рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рддреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рдПрдЧреА рдХрд┐ рдЕрдЧрд▓реА рдмрд╛рд░ рдирд┐рдпрдВрддреНрд░рдг рдШреЛрд╖рдгрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рдЬрд╛рдПред рдпрджрд┐ рдЪрд░ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдирд┐рдпрдВрддреНрд░рдг рдШреЛрд╖рдгрд╛ рдореЗрдВ рд╕рдорд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ, рд╕рдорд╡рд░реНрддреА рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╛рд░рдВрдн (*) рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛ ред рдпрджрд┐ рдирд┐рдпрдВрддреНрд░рдг рдкреБрдирдГ рдШреЛрд╖рдгрд╛ рдореЗрдВ рдкреБрди: рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдЪрд░ рдХреЛ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред

(*) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд┐рд╕реА рднреА рдЧрддрд┐рд░реЛрдз рдХрд╛ рдкрд░рд┐рдЪрдп рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП
( рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ )

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

рдЕрдм рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдмрд╛рдХреА рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рд╕рдВрдХрд▓рдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирдП рдорд╛рдирдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЬреЛ рдХреЗрд╡рд▓ рдпрд╣ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдкреНрд░рдпреЛрдЧ


рдорд▓реНрдЯреА-рдереНрд░реЗрдбреЗрдб рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдореИрдВ рдЕрд▓реНрдЯреАрдореЗрдЯ ++ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдпрд╣ рдХрд╛рдлреА рд╣рд▓реНрдХрд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ, рдпрд╣ рдПрдХ рдореМрд▓рд┐рдХ рднреВрдорд┐рдХрд╛ рдирд╣реАрдВ рдирд┐рднрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдмреВрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред

рд╣рдорд╛рд░реЗ рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ:

 struct A { A() { Cout() << '{'; //     Thread::Sleep(10); //  10  if (++ x != 1) Cout() << '2'; //  :    Cout() << '}'; //    } ~A() { Cout() << '~'; //   } int x; }; 

рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреНрд╖рдг рдореЗрдВ, x рдХрд╛ рдорд╛рди 0 рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╕рд┐рдВрдЧрд▓рдЯрди рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рд╕реНрдерд┐рд░ рд╢рдмреНрдж рдХреЗ рд╕рд╛рде, рдЬрдм рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рднреА POD рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ 0. рдорд╛рди рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рддрдм рд╣рдо рдСрдкрд░реЗрд╢рди рдХреА рдЕрд╡рдзрд┐ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддреЗ рд╣реБрдП, рдХреБрдЫ рд╕рдордп рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрд╛рдВрдЪ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдПрдХрддрд╛ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рд╡рд░реНрдг рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕реЗ рдореИрдВ рдЯрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ рдирдпрд╛ рд╕реВрддреНрд░ рдмрдирд╛рддреЗ рд╕рдордп рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 void threadFunction(int i) { Cout() << char('a'+i); //   -    ,    A& a = single<A>(); //    if (ax == 0) Cout() << '0'; //  :    Cout() << char('A'+i); //   -    } 

рдФрд░ рд╣рдо рдереНрд░реЗрдбрдлрдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ 5 рдереНрд░реЗрдбреНрд╕ рд╕реЗ рдПрдХ рд╕рд╛рде рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рд╕реЗ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдпреЛрдЧреА рдкрд╣реБрдВрдЪ рд╣реЛ:

 for (int i = 0; i < 5; ++ i) Thread::Start(callback1(threadFunction, i)); Thread::ShutdownThreads(); 

рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ 2 рд╕рдВрдХрд▓рдХ рдЪреБрдиреЗ рдЬреЛ рдЖрдЬ рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИрдВ: MSVC 2010 рдФрд░ GCC 4.5ред MSVC 2012 рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рднреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдкрд░рд┐рдгрд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ 2010 рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рдХреЗ рдЙрд▓реНрд▓реЗрдЦ рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред

GCC рдХреЗ рд▓рд┐рдП рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░рд┐рдгрд╛рдо:
ab {cde} ABCDE ~

MSVC рдХреЗ рд▓рд┐рдП рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░рд┐рдгрд╛рдо:
ab {0cB0dCe00DE} A ~

рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЪрд░реНрдЪрд╛


рд╣рдо рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВред рдЬреАрд╕реАрд╕реА рдХреЗ рд▓рд┐рдП , рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрддрд╛ рд╣реИ:
  1. рдереНрд░реЗрдб 1 рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбрдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ
  2. рдзрд╛рдЧрд╛ 2 рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбрдлрдВрдХреНрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ
  3. рд╕рд┐рдВрдЧрд▓рдЯрди рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╢реБрд░реВ
  4. рдзрд╛рдЧрд╛ 3 рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбрдлрдВрдХреНрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ
  5. рдзрд╛рдЧрд╛ 4 рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбрдлрдВрдХреНрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ
  6. рдзрд╛рдЧрд╛ 5 рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбрдлрдВрдХреНрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ
  7. рд╕рд┐рдВрдЧрд▓рдЯрди рдЖрд░рдВрднреАрдХрд░рдг рдкреВрд░рд╛
  8. рд╕рднреА рдереНрд░реЗрдб 1-5 рдХреЗ рд▓рд┐рдП рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ
  9. рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд╛рдкреНрддрд┐ рдФрд░ рд╕рд┐рдВрдЧрд▓рдЯрди рд╡рд┐рдирд╛рд╢

рдпрд╣рд╛рдВ рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ: рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдереНрд░реЗрдбрдлрдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд╛рдж рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ => рдЬреАрд╕реАрд╕реА рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИред

MSVC рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдХреБрдЫ рдЕрд▓рдЧ рд╣реИ:
  1. рдереНрд░реЗрдб 1 рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбрдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ
  2. рдзрд╛рдЧрд╛ 2 рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбрдлрдВрдХреНрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ
  3. рд╕рд┐рдВрдЧрд▓рдЯрди рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╢реБрд░реВ
  4. рддреНрд░реБрдЯрд┐: рд╕рд┐рдВрдЧрд▓рдЯрди рдЖрд░рдВрднрд┐рдХ рдирд╣реАрдВ рд╣реИ
  5. рдзрд╛рдЧрд╛ 3 рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбрдлрдВрдХреНрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ
  6. рдзрд╛рдЧрд╛ 2 рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рдзрд╛рдЧрд╛
  7. рддреНрд░реБрдЯрд┐: рд╕рд┐рдВрдЧрд▓рдЯрди рдЖрд░рдВрднрд┐рдХ рдирд╣реАрдВ рд╣реИ
  8. ...
  9. 5 рдзрд╛рдЧреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ
  10. рд╕рд┐рдВрдЧрд▓рдЯрди рдЖрд░рдВрднреАрдХрд░рдг рдкреВрд░рд╛
  11. рдзрд╛рдЧрд╛ 1 рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рдзрд╛рдЧрд╛
  12. рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд╛рдкреНрддрд┐ рдФрд░ рд╕рд┐рдВрдЧрд▓рдЯрди рд╡рд┐рдирд╛рд╢

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд╣рд▓реА рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП - рдпрд╣ рддреБрд░рдВрдд рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЗрд╕рд▓рд┐рдП, рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ MSVC рдареАрдХ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг


рдЖрдЗрдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдорд╛рдирд╛ рдЧрдпрд╛ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдо рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдЕрд▓рдЧ рдХрд░реЗрдВ:

рдЬреАрд╕реАрд╕реА :
 5 T& single() 0x00418ad8 <+0>: push %ebp 0x00418ad9 <+1>: mov %esp,%ebp 0x00418adb <+3>: sub $0x28,%esp 6 { 7 static T t; 0x00418ade <+6>: cmpb $0x0,0x48e070 0x00418ae5 <+13>: je 0x418af0 <single<A>()+24> 0x00418ae7 <+15>: mov $0x49b780,%eax 0x00418aec <+20>: leave 0x00418aed <+21>: ret 0x00418af0 <+24>: movl $0x48e070,(%esp) 0x00418af7 <+31>: call 0x485470 <__cxa_guard_acquire> 0x00418afc <+36>: test %eax,%eax 0x00418afe <+38>: je 0x418ae7 <single<A>()+15> 0x00418b00 <+40>: movl $0x49b780,(%esp) 0x00418b07 <+47>: call 0x4195d8 <A::A()> 0x00418b0c <+52>: movl $0x48e070,(%esp) 0x00418b13 <+59>: call 0x4855cc <__cxa_guard_release> 0x00418b18 <+64>: movl $0x485f04,(%esp) 0x00418b1f <+71>: call 0x401000 <atexit> 8 return t; 9 } 0x00418b24 <+76>: mov $0x49b780,%eax 0x00418b29 <+81>: leave 0x00418b2a <+82>: ret 

рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдП рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ: __cxa_guard_acquire / __ cxa_guard_release, рдЬреЛ рдЖрдкрдХреЛ рдПрдХрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрд╕реА рд╕рдордп рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрдм рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░ рд░рд╣рд╛ рд╣реЛред

MSVC :
 T& single() { 00E51420 mov eax,dword ptr fs:[00000000h] 00E51426 push 0FFFFFFFFh 00E51428 push offset __ehhandler$??$single@UA@@@@YAAAUA@@XZ (0EE128Eh) 00E5142D push eax static T t; 00E5142E mov eax,1 00E51433 mov dword ptr fs:[0],esp ;   00E5143A test byte ptr [`single<A>'::`2'::`local static guard' (0F23944h)],al 00E51440 jne single<A>+47h (0E51467h) ;     "" 00E51442 or dword ptr [`single<A>'::`2'::`local static guard' (0F23944h)],eax 00E51448 mov ecx,offset t (0F23940h) 00E5144D mov dword ptr [esp+8],0 ;  :   00E51455 call A::A (0E51055h) 00E5145A push offset `single<A>'::`2'::`dynamic atexit destructor for 't'' (0EED390h) 00E5145F call atexit (0EA0AD1h) 00E51464 add esp,4 return t; } 00E51467 mov ecx,dword ptr [esp] 00E5146A mov eax,offset t (0F23940h) 00E5146F mov dword ptr fs:[0],ecx 00E51476 add esp,0Ch 00E51479 ret 

рдпрд╣рд╛рдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рд╡реЗрд░рд┐рдПрд╢рди рдХреЛ рд╡реЗрд░рд┐рдлрд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 0x0F23944 рдкрд░ рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрднреА рддрдХ рдкреНрд░рд╛рд░рдВрдн рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдорд╛рди рдПрдХ рдкрд░ рд╕реЗрдЯ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд▓рд╛рдЧрдд рдХреЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рдкреНрд░рдпреЛрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдо рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред

рд╕рд░рд▓ рдЙрдкрд╛рдп


рдЖрдк рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореНрдпреВрдЯреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

 //        struct StaticLock : Mutex::Lock { StaticLock() : Mutex::Lock(mutex) { Cout() << '+'; } ~StaticLock() { Cout() << '-'; } private: static Mutex mutex; }; Mutex StaticLock::mutex; template<typename T> T& single() { StaticLock lock; //   mutex.lock() static T t; //   return t; //  mutex.unlock()    } 

рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░рд┐рдгрд╛рдо:

ab + {cde} -A + -B + -C + -D + -E ~

рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдХреНрд░рдо:
  1. рдереНрд░реЗрдб 1 рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбрдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ
  2. рдзрд╛рдЧрд╛ 2 рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбрдлрдВрдХреНрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ
  3. рд╡реИрд╢реНрд╡рд┐рдХ рддрд╛рд▓рд╛ рд▓реЗрдирд╛: mutex.lock ()
  4. рд╕рд┐рдВрдЧрд▓рдЯрди рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╢реБрд░реВ
  5. рдзрд╛рдЧрд╛ 3 рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбрдлрдВрдХреНрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ
  6. рдзрд╛рдЧрд╛ 4 рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбрдлрдВрдХреНрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ
  7. рдзрд╛рдЧрд╛ 5 рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбрдлрдВрдХреНрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ
  8. рд╕рд┐рдВрдЧрд▓рдЯрди рдЖрд░рдВрднреАрдХрд░рдг рдкреВрд░рд╛
  9. рд╡реИрд╢реНрд╡рд┐рдХ рд▓реЙрдХ рд░рд┐рд▓реАрдЬрд╝: mutex.unlock ()
  10. рдзрд╛рдЧрд╛ 1 рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рдзрд╛рдЧрд╛
  11. рд╡реИрд╢реНрд╡рд┐рдХ рддрд╛рд▓рд╛ рд▓реЗрдирд╛: mutex.lock ()
  12. рд╡реИрд╢реНрд╡рд┐рдХ рд▓реЙрдХ рд░рд┐рд▓реАрдЬрд╝: mutex.unlock ()
  13. рдзрд╛рдЧрд╛ 2 рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рдзрд╛рдЧрд╛
  14. ...
  15. 5 рдзрд╛рдЧреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ
  16. рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд╛рдкреНрддрд┐ рдФрд░ рд╕рд┐рдВрдЧрд▓рдЯрди рд╡рд┐рдирд╛рд╢

рдРрд╕рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдЕрд╕рдВрдЧрдард┐рдд рд╡рд╕реНрддреБ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ: mutex.lock () рдХреЛ рдЖрд░рдВрднреАрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ mutex.unlock () рдЖрд░рдВрднреАрдХрд░рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢реЗрд╖ рдзрд╛рдЧреЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рд╛рд░рдВрдн рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рдЗрдирд╕ рд╣реИ: рд▓реЙрдХрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдореЗрд╢рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рд╛рд░рдВрдн рд╣реЛ рдпрд╛ рдирд╣реАрдВред рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдХреЗрд╡рд▓ рдЙрд╕ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрдм рд╣рдо рдХрд┐рд╕реА рдРрд╕реА рд╡рд╕реНрддреБ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЕрднреА рддрдХ рдЖрд░рдВрдн рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдЬреАрд╕реАрд╕реА рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ )ред

рдбрдмрд▓-рдЪреЗрдХрд┐рдВрдЧ рд▓реЙрдХрд┐рдВрдЧ рдкреИрдЯрд░реНрди


рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдХреНрд╕рд░ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрд┐рд╕реЗ рдбрдмрд▓-рдЪреЗрдХ рд▓реЙрдХрд┐рдВрдЧ рдкреИрдЯрд░реНрди ( DCLP ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдбрдмрд▓-рдЪреЗрдХ рд▓реЙрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рд╕рд╛рд░ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИ:
  1. рд╣рд╛рд▓рдд рдХреА рдЬрд╛рдБрдЪ: рдЖрд░рдВрднреАрдХреГрдд рдпрд╛ рдирд╣реАрдВ? рдпрджрд┐ рд╣рд╛рдБ, рддреЛ рддреБрд░рдВрдд рд╡рд╕реНрддреБ рдХрд╛ рд▓рд┐рдВрдХ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ
  2. рддрд╛рд▓рд╛ рд▓рдЧрд╛ рд▓реЛ
  3. рд╣рдо рджреВрд╕рд░реА рдмрд╛рд░ рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рдЗрд╕реЗ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд▓реЙрдХ рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рд▓рд┐рдВрдХ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ
  4. рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ
  5. рд╕реНрдерд┐рддрд┐ рдХреЛ "рдЖрд░рдВрднреАрдХреГрдд" рдореЗрдВ рдмрджрд▓реЗрдВ
  6. рд▓реЙрдХ рдирд┐рдХрд╛рд▓реЗрдВ рдФрд░ рд▓рд┐рдВрдХ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ

рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЗрд╕ рдХреНрд░рдо рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдирд╛рдо рдХрд╣рд╛рдБ рд╕реЗ рдЖрддрд╛ рд╣реИ: рд╣рдо рд╕реНрдерд┐рддрд┐ рдХреЛ 2 рдмрд╛рд░ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рдЕрд╡рд░реБрджреНрдз рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдФрд░ рдЙрд╕рдХреЗ рддреБрд░рдВрдд рдмрд╛рджред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдЪреЗрдХ рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ 2 рдереНрд░реЗрдбреНрд╕ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рджреЛрдиреЛрдВ рдереНрд░реЗрдбреНрд╕ рдХреЛ "рдЖрд░рдВрднреАрдХреГрдд рдирд╣реАрдВ" рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд▓реЙрдХ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рддреЛ, рдПрдХ рддрд╛рд▓рд╛ рдкрд░ рдПрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдзрд╛рдЧрд╛, рдпрджрд┐ рдЖрдк рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдВрдЧрдард┐рдд рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рджреБрдЦрдж рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

DCLP рдХреЛ рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рджреНрд╡рд╛рд░рд╛ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 template<typename T> T& single() { static T* pt; if (pt == 0) //  ,   { StaticLock lock; if (pt == 0) //  ,   pt = new T; } return *pt; } 

рдпрд╣рд╛рдВ, рд╣рдорд╛рд░реЗ рдмрдирд╛рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдПрдХ рд╢рд░реНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ: рдпрджрд┐ рдпрд╣ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ: рдХреЛрдИ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд░рд╕рджрд╛рд░ рдирд╣реАрдВ рд╣реИред рдПрдХ рд╕рдордп рдореЗрдВ, рдпрд╣ рднреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдПрдХ рдкреИрдЯрд░реНрди рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдПрдХ рдПрдВрдЯреАрдкреИрд░реНрдЯрди , рдпрд╛рдиреАред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╕реВрдХреНрд╖реНрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдЬрд╛рдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реИред

рдЦреИрд░, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдирд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ: рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рдЖрд╡реЗрджрди рдХреЗ рдХрд╛рдо рдХреЗ рд╕рдордп рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕рдм рдХреБрдЫ рд╕рд╛рдл рдХрд░ рджреЗрдЧрд╛ (рдЬрдм рддрдХ рдХрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреА рдиреИрдЪреБрд░рд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд▓реЗрдЦрди рдореЗрдВ) рд╕рдВрджреЗрд╢ рд▓реЙрдЧ рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯреЗрдЯрд╕ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛)ред

рджреВрд╕рд░реА рдЕрдзрд┐рдХ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐ рд╣реИ:

 pt = new T; 

рдЖрдЗрдП рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЗрд╕ рдкрдВрдХреНрддрд┐ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдореИрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдЫреЛрдбрд╝ рджреВрдБрдЧрд╛):

 pt = operator new(sizeof(T)); //     new (pt) T; // placement new:       

рдпрд╛рдиреА рдореЗрдореЛрд░реА рдХреЛ рдкрд╣рд▓реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЖрд░рдореНрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ, рдпрд╣ рдкрддрд╛ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рдкрд╣рд▓реЗ рд╣реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЧрдИ рд╣реИ, рдкреАрдЯреА рдорд╛рди рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрднреА рддрдХ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдХреЛрдИ рдереНрд░реЗрдб рд▓реЙрдХ рдХреЗ рдмрд╛рд╣рд░ рдкрд╣рд▓реА рдЬрд╛рдВрдЪ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдПрдХрд▓ рдлрд╝рдВрдХреНрд╢рди рдореЗрдореЛрд░реА рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬрд┐рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирд╣реАрдВред

рдЕрдм рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рджреЛрдиреЛрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг


рд╣рдо рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ: рд╣рдо рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬреИрд╕реЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП:

 //      template<typename T> T& singleUnsafe() { static T t; return t; } //       template<typename T> T& single() { static T* volatile pt; if (pt == 0) { T* tmp; { StaticLock lock; tmp = &singleUnsafe<T>(); } pt = tmp; } return *pt; } 

рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдЕрдм рдПрдХрд▓рдЙрдкрд╕рдлреЗ рд╕рдорд╛рд░реЛрд╣) рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рднреА рдХреЛ рдХреЙрд▓ рдХреА рдХреНрд░рдордмрджреНрдзрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рддрд╛рд▓реЛрдВ рдХреЗ рд╕рд╣реА рдЙрдкрдпреЛрдЧ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИред рдПрдХ рдЕрд░реНрде рдореЗрдВ, 2 рдЪреЗрдХ рднреА рд╣реИрдВ, рдХреЗрд╡рд▓ рд▓реЙрдХ рдХреЗ рдмрд╛рд╣рд░ рдкрд╣рд▓рд╛ рдЪреЗрдХ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдЖрдВрддрд░рд┐рдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЕрддрд┐-рдЕрдиреБрдХреВрд▓рди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЗ рдкреБрди: рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдерд┐рд░ рдХреАрд╡рд░реНрдб рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ pt рдкреЙрдЗрдВрдЯрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рддрд╛рд▓реЗ рдХреЗ рдмрд╛рд╣рд░ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

рдРрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 template<typename T> T& single() { ;   00083B30 push 0FFFFFFFFh 00083B32 push offset __ehhandler$??$single@UA@@@@YAAAUA@@XZ (0A13B6h) 00083B37 mov eax,dword ptr fs:[00000000h] 00083B3D push eax 00083B3E mov dword ptr fs:[0],esp 00083B45 push ecx static T* volatile pt; if (pt == 0) ;     00083B46 mov eax,dword ptr [pt (0E3950h)] 00083B4B test eax,eax 00083B4D jne single<A>+7Dh (83BADh) { T* tmp; { StaticLock lock; ;   EnterCriticalSection    00083B4F push offset staticMutex (0E3954h) 00083B54 mov dword ptr [esp+4],offset staticMutex (0E3954h) 00083B5C call dword ptr [__imp__EnterCriticalSection@4 (0ED6A4h)] tmp = &singleUnsafe<T>(); 00083B62 mov eax,1 00083B67 mov dword ptr [esp+0Ch],0 ;   00083B6F test byte ptr [`singleUnsafe<A>'::`2'::`local static guard' (0E394Ch)],al 00083B75 jne single<A>+68h (83B98h) 00083B77 or dword ptr [`singleUnsafe<A>'::`2'::`local static guard' (0E394Ch)],eax 00083B7D mov ecx,offset t (0E3948h) 00083B82 mov byte ptr [esp+0Ch],al ;  :   00083B86 call A::A (1105Fh) 00083B8B push offset `singleUnsafe<A>'::`2'::`dynamic atexit destructor for 't'' (0AD4D0h) 00083B90 call atexit (60BB1h) 00083B95 add esp,4 } ;   LeaveCriticalSection    00083B98 push offset staticMutex (0E3954h) 00083B9D call dword ptr [__imp__LeaveCriticalSection@4 (0ED6ACh)] pt = tmp; ;    pt    00083BA3 mov dword ptr [pt (0E3950h)],offset t (0E3948h) } return *pt; } 00083BAD mov ecx,dword ptr [esp+4] ;     eax 00083BB1 mov eax,dword ptr [pt (0E3950h)] 00083BB6 mov dword ptr fs:[0],ecx 00083BBD add esp,10h 00083BC0 ret 

рдореИрдВрдиреЗ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛрдб рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рддрд╛рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХреЗ рдХрд┐ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рдерд╛ред рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛрдб рдХреЛ рдиреЛрдЯ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ: рдПрдХ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдЯреБрдХрдбрд╝рд╛ред рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдЬреАрд╕реАрд╕реА рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬрд╣рд╛рдВ рдЙрддреНрдкрдиреНрди рдЕрдкрд╡рд╛рдж рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ рдЯреЗрдмрд▓ рдХреЛ рд╢реВрдиреНрдп рдУрд╡рд░рд╣реЗрдб рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ рдкреНрд░рдореЛрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк MSVC рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ x64 рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 template<typename T> T& single() { 000000013F401600 push rdi 000000013F401602 sub rsp,30h 000000013F401606 mov qword ptr [rsp+20h],0FFFFFFFFFFFFFFFEh 000000013F40160F mov qword ptr [rsp+48h],rbx static T* volatile pt; if (pt == 0) 000000013F401614 mov rax,qword ptr [pt (13F4F5890h)] 000000013F40161B test rax,rax 000000013F40161E jne single<A>+75h (13F401675h) { T* tmp; { StaticLock lock; 000000013F401620 lea rbx,[staticMutex (13F4F58A0h)] 000000013F401627 mov qword ptr [lock],rbx 000000013F40162C mov rcx,rbx 000000013F40162F call qword ptr [__imp_EnterCriticalSection (13F50CCC0h)] ; nop !!! 000000013F401635 nop tmp = &singleUnsafe<T>(); 000000013F401636 mov eax,dword ptr [`singleUnsafe<A>'::`2'::`local static guard' (13F4F588Ch)] 000000013F40163C lea rdi,[t (13F4F5888h)] 000000013F401643 test al,1 000000013F401645 jne single<A>+65h (13F401665h) 000000013F401647 or eax,1 000000013F40164A mov dword ptr [`singleUnsafe<A>'::`2'::`local static guard' (13F4F588Ch)],eax 000000013F401650 mov rcx,rdi 000000013F401653 call A::A (13F401087h) 000000013F401658 lea rcx,[`singleUnsafe<A>'::`2'::`dynamic atexit destructor for 't'' (13F4A6FF0h)] 000000013F40165F call atexit (13F456664h) ; nop !!! 000000013F401664 nop } 000000013F401665 mov rcx,rbx 000000013F401668 call qword ptr [__imp_LeaveCriticalSection (13F50CCD0h)] pt = tmp; 000000013F40166E mov qword ptr [pt (13F4F5890h)],rdi } return *pt; 000000013F401675 mov rax,qword ptr [pt (13F4F5890h)] } 000000013F40167C mov rbx,qword ptr [rsp+48h] 000000013F401681 add rsp,30h 000000013F401685 pop rdi 000000013F401686 ret 

рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдирдУрдкреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдЙрддреНрдкрдиреНрди рдЕрдкрд╡рд╛рдж рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрдЯреИрдХ рдкрджреЛрдиреНрдирддрд┐ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдХрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдЙрддреНрдкрдиреНрди рдЕрдкрд╡рд╛рдж рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдУрд╡рд░рд╣реЗрдб рднреА рдирд╣реАрдВ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕рд▓рд┐рдП, рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рд▓реЗрдЦ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдХрд▓рдХ рдирдП рдорд╛рдирдХ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд░рдЦрддреЗ рд╣реИрдВ: рдЬреАрд╕реАрд╕реА рдЖрдзреБрдирд┐рдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛрдиреЗ рдХреА рдкреВрд░реА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдПрдХрд▓ рдХреЗ рдЖрд░рдВрдн рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ; MSVC рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдПрдХ рд╕рд╛рдл рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЧрдВрднреАрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдУрд╡рд░рд╣реЗрдб рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдФрд░ рдХреБрд╢рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред

рдкреБрдирд╢реНрдЪ


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

рдЕрджреНрдпрддрди


рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓реЗрдЦ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╕рд╛рд╣рд┐рддреНрдп


[рез] рд╣реИрдмреНрд░рд╣реНрдм: рд╕рд┐рдВрдЧрд▓рдЯрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
[реи] рд╣реИрдмреНрд░рд╣реНрдм: рд╕рд┐рдВрдЧрд▓рдЯрди рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо
[рей] рд╣рдмреНрд░рд╛рд╣реНрд░: рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЙрд▓рдЯрд╛ рдФрд░ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛
[рек] рд╕реА ++ реж рдПрдХреНрд╕ рдорд╛рдирдХ рдХреА рдЕрдВрддрд┐рдо рд╕рдорд┐рддрд┐ рдбреНрд░рд╛рдлреНрдЯ (рдПрдлрд╕реАрдбреА)
[рел] рд╕реА ++ рдорд╛рдирдХ - рдПрдПрдирдПрд╕рдЖрдИ рдЖрдИрдПрд╕рдУ рдЖрдИрдИрд╕реА
резрек 6 Iреи реирежрежрей [рем] рдЕрдВрддрд┐рдо ++: рд╕реА ++ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд░реИрдкрд┐рдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ
[Bo] рдмреВрд╕реНрдЯ рд╕реА ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА
[]] рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ : рдбрдмрд▓-рдЪреЗрдХрд┐рдВрдЧ рд▓реЙрдХрд┐рдВрдЧ
[9] рдПрдВрдЯреАрдкреИрдЯрд░реНрди рдбрдмрд▓-рдЪреЗрдХ рд▓реЙрдХрд┐рдВрдЧ рд╕реЗ рдорд┐рд▓реЛ

Source: https://habr.com/ru/post/In150276/


All Articles