рд╣реЗрд▓реЛ, рд╣реЗрдмреНрд░! рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЗрд╕ рд▓реЗрдЦ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ C ++ рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХреЙрдкреА рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╛рд╣рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛ред рдЗрд╕рдореЗрдВ рдХрд╛рдлреА рдХреБрдЫ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИрдВ (рднрд╛рдЧ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЕрдЧрд░ рдХрд┐рд╕реА рдЧрдВрднреАрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рднрд╛рдЧ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рд╕реЗ рдХреБрдЫ рдЕрд▓реНрдкрд╡рд┐рдХрд╕рд┐рдд рд╕рдорд░реНрдерди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛), рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХреЛрдб 100 рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╣реИред рд░реБрдЪрд┐ рдХреГрдкрдпрд╛ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗред рдХрдо рд╕реЗ рдХрдо OOP, рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкреИрдЯрд░реНрди рдФрд░ рдбрд░рд╛рд╡рдирд╛ рдЬрд╛рджреВ рдХреА рд░рд╕реНрдореЗрдВ рд╣реИрдВред
рд╢реБрд░реВ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реИ?
рдЧрд░реНрдЧрд╛рдмреЗ рдХрд▓реЗрдХреНрдЯрд░ (рдЬреАрд╕реА) рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдРрд╕рд╛ рддрд░реАрдХрд╛ рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рд░реИрдо рдХреЛ рдвреЗрд░ рдкрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдиреАрдЪреЗ рдХреА рд░реЗрдЦрд╛ рд╕рд░рд▓ рд╣реИ - рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рдЙрд╕рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ, рдФрд░ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрдм рдЙрд╕рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрдЧреА рдФрд░ рдЙрд╕реЗ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореЗрдореЛрд░реА рд▓реАрдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╡реАрд░рддрд╛рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдЕрддрд┐рд░рдВрдЬрд┐рдд рд╡рд┐рднрд╛рдЬрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЕрдлрд╝рд╕реЛрд╕ рд╣реИред
рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╛рд╣рдХ рд╣реИрдВ - рд░реВрдврд╝рд┐рд╡рд╛рджреА рдФрд░ рдирдХрд▓ред
рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рдХреБрдЫ рдирд╡реАрдирддрдо рдорд╛рдирдХ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢реЗрдпрд░реНрдб_рдкреНрдЯреНрд░ рддрдВрддреНрд░ рдирдП рдФрд░ рдбрд┐рд▓реАрдЯ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрди рд▓рд┐рдВрдХ рдХреЛ рдЧрд┐рдирддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рддреА рд╣реИ рддреЛ рдЗрд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓реЗрддреЗ рд╣реИрдВред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ рдЬрдм рдХрдИ рдЫреЛрдЯреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рдЫреЛрдЯреА рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рдЬреАрд╡рдирдХрд╛рд▓ рдирд╣реАрдВред рдирддреАрдЬрддрди, рдвреЗрд░ рд╡реИрдз рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЦреВрдиреА рдЧрдбрд╝рдмрдбрд╝ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрдИ рджрд╕рд┐рдпреЛрдВ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдореБрдлреНрдд рд╕реНрдореГрддрд┐ рдХреЗ рдЯреБрдХрдбрд╝реЗ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рджреЗрд╢реА рдХреЛрдб рдкрд╛рдпрдерди рд╕реЗ рдИрд░реНрд╖реНрдпрд╛ рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдвреЗрд░ рд╡рд┐рдЦрдВрдбрди - рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд▓реЗрдХреНрдЯрд░реЛрдВ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдирдХрд▓ред рдлрд┐рд▓рд╣рд╛рд▓, рдмрдХрд╡рд╛рд╕ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреА рд░рдгрдиреАрддрд┐ рдЪрд┐рдВрддрди рд╣реИред рдЬрдм рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:
1. рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВред
2. рд╕рднреА рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИред
3. рд╕рднреА рдореЗрдореЛрд░реА рдХреЛ рд░рд┐рд▓реАрдЬрд╝ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдм рдЙрдкрдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реИред
рдореИрдВ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдХрд░ рджреВрдВрдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд┐рд╕реА рднреА рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдХрд░реАрдм рд╕реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рди рд╣реА рд╕реА ++ рдХрд╛рдо рдХреЗ рд▓рд┐рдП "рд╡рдпрд╕реНрдХ" рдЬреАрд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реАред рд╢рд╛рдпрдж, рдЕрдм рдореИрдВ рдЬрд┐рд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдЙрд╕рдореЗрдВ рдПрдХ рдирд╛рдо рд╣реИ, рд╢рд╛рдпрдж рдПрдХ рдирд╛рдо рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдореИрдВ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд┐рдирд╛ рдХрд░реВрдВрдЧрд╛ред
рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдореИрдВ рд╕реНрдореГрддрд┐ рдХреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рдЧреНрд░рд╛рдл рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред рдлрд┐рд░, рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдмрд╛рдж "рдЬреАрд╡рд┐рдд" рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдмрд┐рдВрджреБрдУрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рд╣реИрдВред рдЗрд╕рд╕реЗ рд╕рд╡рд╛рд▓ рдЦрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХрд┐рд╕реА рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдХреЗ рдкрд╛рд╕ рд╕рдВрдХреЗрдд рдХрд╣рд╛рдВ рд╣реИрдВред рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдореИрдЬрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдПрд▓реЛрдХреЗрдЯрд░ рдмрдирд╛рдирд╛ рд╣реИред рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдПрдХ рднрдпрд╛рдирдХ рд╡рд┐рдЪрд╛рд░ред рджреВрд╕рд░рд╛ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╣реЗрдбрд░ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдЬреАрд╕реА рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ (рдУрд╣ рд╣рд╛рдВ, рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрднрд╛рд╕реА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ)ред
рд╣реИрдбрд░ рдХреЛ рдХрдИ рддрд░рд╣ рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░рд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИ рдЬреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ)ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдЬреЛ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ, рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:
enum { STRUCT_SZ = 0, REF_COUNT = 1 }; struct gcHeader { union { int gcData[2]; gcHeader* post_gcAddress; }; };
рджреВрд╕рд░реЗ, рд╣реЗрдбрд░ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рдФрд░ рдХрд╣реАрдВ рдирд╣реАрдВ, рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ gcData [REF_COUNT] рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рдПрдЧреАред рдпрд╣ рдЙрди рд╕реАрдорд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рд╕реЗ рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред GcData [STRUCT_SZ] рдмрд╛рдЗрдЯ рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЖрдХрд╛рд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред рдореИрдВ рдмрд╛рдж рдореЗрдВ рд╕реВрдЪрдХ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдкреНрд░рдХрдЯ рдХрд░реВрдВрдЧрд╛ред рдЬреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЖрдХрд╛рд░ рд╕реВрдЪрдХ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рдерд╛ (рдЕрдм 2014, рд▓реЛрдЧ!)ред
рдорд╣рд╛рди, рдЕрдм рд╣рдо рдЕрдкрдиреА рд╕реНрдореГрддрд┐ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХрд╣рд╛рдВ рдкрд╣реБрдВрдЪрдирд╛ рд╣реИред рд╕реНрдореГрддрд┐ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдХреНрд╖реЗрддреНрд░ рдЬреЛ рдХрд┐рд╕реА рднреА рдХреНрд╖рдг рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╕реБрд▓рдн рд╣реИ, рд╡рд╣ рд╣реИ рд╕реНрдЯреИрдХред рд╕рдорд╕реНрдпрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╣реИ - рд╣рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдПрдХ рдЬреАрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреНрдпрд╛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдРрд╕реЗ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рд╕реНрдерд╛рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
vector<gcHeader**> referencesStack; template <class T> class stackRef { public: T* ref; stackRef(){ ref = nullptr; referencesStack.push_back(reinterpret_cast<gcHeader**>(&ref)); } ~stackRef(){ referencesStack.pop_back(); } };
StackRef рд╡рд░реНрдЧ рдмрд╕ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдЖрд░рдВрдн рдХрд░рдиреЗ рдкрд░, рдпрд╣ рд▓рд┐рдВрдХ рд╕реНрдЯреИрдХ рдкрд░ рдЕрдкрдирд╛ рдкрддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд╡рд┐рдзреНрд╡рдВрд╕рдХ, рддрджрдиреБрд╕рд╛рд░, рдПрдХ рд╣реА рдвреЗрд░ рд╕реЗ рдПрдХ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкрддреЗ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдХрд╛ рдвреЗрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╡рд┐рд╕рдВрдЧрддрд┐рдпрд╛рдВ рди рд╣реЛрдВред
рдХрдХреНрд╖рд╛ рдореЗрдВ рдЖрдкрдХреЛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдбреЗрд░реЗрдлреЗрд░рд┐рдВрдЧ, рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ, рдЖрджрд┐, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдПрдЧрд╛ рдХрд┐ рдмреВрд╕реНрдЯ рдлрд╛рдЙрдВрдбреЗрд╢рди рдХреЗ рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рдЬрд▓реНрдж рд╣реА рдореБрдЭрд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдЧрд╛ред
рд╕рд╣рд╛рдпрдХ рд╕рдВрд░рдЪрдирд╛рдПрдВ рддреИрдпрд╛рд░ рд╣реИрдВред рдЖрдк рдореЗрдореЛрд░реА рдХреЗ рдЖрд╡рдВрдЯрди рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рдЗрд╕ рддрд░реАрдХреЗ рдХреА рдПрдХ рд╢рд╛рдВрдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╣реИ рдЬреИрд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдорд╛рдирдХ C ++ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдореБрдХреНрдд рдмреНрд▓реЙрдХреЛрдВ рдХреА рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдирдП рдХреЗ рдмрд╛рдж, рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЙрдкрдпреБрдХреНрдд рдмреНрд▓реЙрдХ рдвреВрдВрдвреЗрдВ, рдлрд┐рд░ рдЗрд╕реЗ рджреЛ рдЫреЛрдЯреЗ рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдХреБрдЫ рдФрд░ рдЬреЛ рдЖрдзреБрдирд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд░рддреЗ рд╣реИрдВред рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдЯрд╛рдП рдЧрдП рдСрдкрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдХрдмреНрдЬреЗ рд╡рд╛рд▓реА рдореЗрдореЛрд░реА рдПрдХ рдареЛрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ рдЬрд╛рдПрдЧреАред рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдЗрд╕ рдмреНрд▓реЙрдХ рдХрд╛ рдЖрдХрд╛рд░ рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдСрдкрд░реЗрд╢рди рдЬреЛ рдУ (1) рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЕрдм рдРрд╕рд╛ рдЕрджреНрднреБрдд рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЛ рдЙрдХрд╕рд╛рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдХрд┐ рдХреЗрд╡рд▓ рдЙрд╕ рдореЗрдореЛрд░реА рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬрд┐рд╕рдХреА рдЕрдм рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдЖрдк рд╡рд╣рд╛рдВ рд░реБрдХ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдореЗрдореЛрд░реА рдХреЛ 4 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕реВрдЪреА рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, 4 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рдЖрд▓рд╕реНрдп рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИред
const int CHUNK_SIZE = 4096; const int OVERDRAFT = 128; const int ACTUAL_SIZE = CHUNK_SIZE + OVERDRAFT;
FirstChunk рд╕реВрдЪреА рдХреА рд╢реБрд░реБрдЖрдд рд╣реИ, currentChunk рдореЗрдореЛрд░реА рдХрд╛ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдорд┐рдд рдмреНрд▓реЙрдХ рд╣реИред urrentOffset - currentChunk рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ рдореБрдлреНрдд рдореЗрдореЛрд░реА рд╕реЗрдЧрдореЗрдВрдЯ рдХреА рд╢реБрд░реБрдЖрддред
gcHeader* gcRawAlloc(int size, int refCount){ if (size > CHUNK_SIZE)
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреЗрдд рд╣реИрдВред 12 рд╡реАрдВ рдкрдВрдХреНрддрд┐ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рд╕рдордп, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рд╕реЛрдЪрдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдирдИ рд╡рд╕реНрддреБ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╣реИред рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕рдХреЗ рдкрд╛рд╕ рд╣рдорд╛рд░рд╛ gcHeader рд╣реИ, рдФрд░ рдпрд╣ рдЕрднреА рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд╢реАрд░реНрд╖рдХ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рд░рд╣рд╕реНрдпрдордп рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛ рдорддрд▓рдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
temp->gcData[REF_COUNT] = (refCount << 1)| 1;
?
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣реЗрдбрд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдлрд┐рд░ рд╕реЗ рдЧреМрд░ рдХрд░реЗрдВред
struct gcHeader { union { int gcData[2]; gcHeader* post_gcAddress; }; };
рдпреВрдирд┐рдпрди рдХреАрд╡рд░реНрдб рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ gcData рд╕рд░рдгреА рдФрд░ post_gcAddress рдкреЙрдЗрдВрдЯрд░ рджреЛрдиреЛрдВ рдПрдХ рд╣реА рдкрддреЗ рдкрд░ рд╕реНрдерд┐рдд рд╣реИрдВред рдпрд╣ рд╕реНрдореГрддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ C ++ рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдВрдШ рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВред рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛, рдЬреИрд╕реЗ рдбреЗрдЯрд╛ рд╕рдВрд░реЗрдЦрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛, рдорджрдж рдХрд░рддреА рд╣реИред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдПрдХ рдмрд╛рдЗрдЯ рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмреЗ рдХрд┐рд╕реА рднреА рдЪрд░ рдХреЛ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдорд╢реАрди рд╢рдмреНрдж рдХреЗ рдЧреБрдгрдХреЛрдВ рдХреЗ рдкрддреЗ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рд╕рдВрд░реЗрдЦрдг рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдкреБрд░рд╛рдиреЗ рдПрдЖрд░рдПрдо рдЖрдорддреМрд░ рдкрд░ рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдирддреАрдЬрддрди, рд╕реВрдЪрдХ рдХреЗ 2 рдпрд╛ 3 рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд╡рд┐рд╡реЗрдХ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд╛рд▓-рдХрд╛рд▓реЗ рдкреЗрдбрд╝реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдЕрдХреНрд╕рд░ рдмреВрд▓рд┐рдпрди рдЪрд░ рдХреЗ рдмрдЬрд╛рдп рдЕрдВрддрд┐рдо рдмрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рднреА рдРрд╕рд╛ рд╣реА рд╣реИред рдпрджрд┐ рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рдПрдХ рд╣реИ, рддреЛ рдЗрди рдЖрда рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рджреЛ ints рдХреА рдПрдХ рд╕рд░рдгреА рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╛рд╣рдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдмрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ "рдпрд╣ рдПрдХ рдмрд╣реБрд░реВрдкреА рд╡рд╕реНрддреБ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ, рдЗрд╕рдореЗрдВ рдПрдХ рд╡рд╛рдЗрдмреЗрдЯрд░ рдкреЙрдЗрдВрдЯрд░ рд╣реИ, рдЗрд╕реЗ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рди рдХрд░реЗрдВ"ред
рдЦреИрд░, рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рдЖрд╡рд░рдг, рддрд╛рдХрд┐ рдЖрд╡рдВрдЯрдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрд╣реБрдд рджрд░реНрдж рди рд╣реЛред
template <class T> T* gcAlloc(){ return reinterpret_cast<T*>(gcRawAlloc(sizeof(T), T::refCount)); }
рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдЗрдордкреНрд▓реЗрд╕ рдирдпрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡рд╛рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рд╣реЛ рдЬрд╛рдПрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдо рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрд╕рдХрд╛ рд╡рд░реНрдЧ рд╕реНрдерд┐рд░ рд╕реНрдерд┐рд░ рд░рд┐рдлреНрд▓реЗрдХреНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдХ рдмрд╛рд╣рд░реА рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЕрдиреНрдпрдерд╛, рдореИрдВ рдЕрдкрдиреЗ рдкреИрд░ рдХреЛ рд╢реВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХрдо рд╕реЗ рдХрдо рддреАрди рддрд░реАрдХреЗ рджреЗрдЦрддрд╛ рд╣реВрдВред
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдвреЗрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
void gcInit(){ firstChunk = currentChunk = new gcChunk; firstChunk->next = nullptr; currentOffset = 0; chunkCount = 1; }
рдпрд╣ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдп, gcCollect, рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдкреБрд░рд╛рдиреА рд╕реВрдЪреА рдореЗрдВ рд╕рдВрдХреЗрдд рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпреЗ рд░реЗрдЦрд╛рдПрдБ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рд▓рдЧрднрдЧ рджреЛрд╣рд░рд╛рддреА рд╣реИрдВред
void gcCollect(){
рдЕрдЧрд▓рд╛, рд╣рдо рд╕реНрдЯреИрдХ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рддреНрдпреЗрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрд╕реЗрдВрдмрд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
for (auto i = referencesStack.begin();i != referencesStack.end(); ++i ) gcMove(*i);
рдФрд░ рдЕрдм рд╕рд┐рд░реНрдл рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕реНрдореГрддрд┐ рдореБрдХреНрддред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдЯрд╛рдиреЗ рдХреЛ рдХреЗрд╡рд▓ рдореЗрдореЛрд░реА рдХреЗ рдмрдбрд╝реЗ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЛ рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗрд╡рд▓ рдореБрдлреНрдд рдореЗрдореЛрд░реА рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рдХрд░рдиреЗ рдФрд░ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдорд╛рд░реНрдХ рдПрдВрдб рд╕реНрд╡реАрдк рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЗрд╕рдХреА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрдирд╛ рдЬреНрдпрд╛рджрд╛ рдХрдард┐рди рд╣реИред
рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢ gcMove рдлрд╝рдВрдХреНрд╢рди рд╣реИред
bool isPointer(gcHeader a){ return (a.gcData[REF_COUNT] & 1) == 0; } void gcMove(gcHeader** current){ if (*current == nullptr) return; if (isPointer(**current)){
рдЪрд▓реЛ рдмреАрдЪ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рд▓рд┐рдВрдХ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдбреЗрдЯрд╛ рдХреЗ
рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ
рдПрдХ рд╕рдВрдХреЗрддрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЬреАрд╕реА рдирдП рд╣реАрдк рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХ рдорд╛рддреНрд░рд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рд╣реЗрдбрд░ рд╕реЗ рдХрд┐рддрдирд╛ рдЬрд╛рдирддрд╛ рд╣реИ) рдФрд░ рдкреБрд░рд╛рдиреЗ рдЕрд╡рддрд╛рд░ рд╕реЗ рдирдП рдореЗрдВ рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рд╡рд╣ рдкреБрд░рд╛рдиреЗ рд╣реЗрдбрд░ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирдпрд╛ рдкрддрд╛ рд▓рд┐рдЦрддрд╛ рд╣реИред рдЕрдм, рдпрджрд┐ рдХрдИ рд╕рдВрджрд░реНрдн рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдмрд╛рд░ (рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ, рдЧрд╛рд░рдВрдЯреАрдХреГрдд, 0) рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдмрд╛рдж рдореЗрдВ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдкреБрд░рд╛рдиреЗ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдирдИ рдХреЙрдкреА рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред
рдЕрдм, рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЙрдирдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд▓рд╛рдЗрди
gcHeader** iterator = reinterpret_cast<gcHeader**>(temp) + 1;
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд╣рд▓реА рдХрдбрд╝реА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдорд┐рд▓рддрд╛ рд╣реИ (рдпрджрд┐ рдХреЛрдИ рд╣реИ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ)ред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЖрдХрд╛рд░ (gcHeader) == рдЖрдХрд╛рд░ (рд╢реВрдиреНрдп *)ред рдЕрдиреНрдпрдерд╛, рдпрд╣ рдХреБрдЫ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред
рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рдПрдХ рдореНрдпреВрдЯ рдкреЙрдЗрдВрдЯ рд╣реИред рдореИрдВ рд╕рд┐рд░реНрдл gcMove рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╣рддрд╛ рд╣реВрдВред рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо
рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдПрдХ рдЧреНрд░рд╛рдл рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред
рдореЗрд░реЗ рд▓рд┐рдП рдХрдЪрд░рд╛ рдмреАрдирдиреЗ рд╡рд╛рд▓реЛрдВ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреА рд╣рддреНрдпрд╛рд░реА рд╡рд┐рд╢реЗрд╖рддрд╛, рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдиреАрдпрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдФрд░ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рднреА рдпрдерд╛рд╕рдВрднрд╡ рдмрдВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рддреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЕрдкрдиреА рдХреИрд╢ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рдардЖрдк рдПрдХ рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдмрдирд╛рдПрдВ рдФрд░ рдордирдорд╛рдиреЗ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рддрддреНрд╡реЛрдВ рдХреЛ рдбрд╛рд▓рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред рдФрд░ рдлрд┐рд░ рдмрд╕ рдкреВрд░реА рд╕реВрдЪреА рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдПрдХ C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдордЬрдмреВрд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдмрд╛рдж Java рдпрд╛ C # рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдВрддрд┐рдо рдЪрд░рдг рд▓рдВрдмрд╛ рд▓рдЧреЗрдЧрд╛ред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ C ++ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓рдЧрд╛рддрд╛рд░ рдХреИрд╢ рдорд┐рд╕ рдкрд░ рд▓реЙрдХ рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдзреАрдореА рд░реИрдо рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рдЖрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛ред рдЬрд╛рд╡рд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд▓рдЧрднрдЧ рдкреВрд░реЗ рдРрд░реЗ рдХрд╛ рдмрд╛рдИрдкрд╛рд╕ рд╣реЛрдЧрд╛ред
рдореЗрд░рд╛ рдЬреАрд╕реА рдирд╣реАрдВ рд╣реИ рдореИрдВрдиреЗ рд╕рд╛рджрдЧреА рдХреЗ рдХрд╛рд░рдг рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдмрд╛рдИрдкрд╛рд╕ рдЪреБрдирд╛ред
рдЪреМрдбрд╝рд╛рдИ рдореЗрдВ рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдСрд░реНрдбрд░
рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред рдпрд╣ рднреНрд░рдорд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЙрди рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛,
рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ , рдЬреИрд╕реЗ рдХрд┐ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдорд┐рд╕рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рд╡рд╣ рд╕рдм рд╣реИред рдпрд╣ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред
рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓
рдЦреЛрдЬ рдкреЗрдбрд╝ рд▓реЗ рдЬрд╛рдКрдВрдЧрд╛
struct searchTree { gcHeader gc; searchTree* left; searchTree* right; int key; static const int refCount = 2; };
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рд╢реАрд░реНрд╖ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╣рдорд╛рд░реЗ рдвреЗрд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╢реАрд░реНрд╖рдХ рджреЗрдиреЗ рдХреЗ рдмрд╛рджред
void stAdd(searchTree* &target, int key){ if (target == nullptr){ target = gcAlloc<searchTree>(); target->left = target->right = nullptr; target->key = key; return; } if (target->key == key) return; if (target->key < key) stAdd(target->left, key); else stAdd(target->right, key); }
рдкреЗрдбрд╝ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ред рдЧреМрд░ рдХрд░реЗрдВ рдХрд┐ gcAlloc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
searchTree* stFind(searchTree* target, int key){ if (target == nullptr || target->key == key) return target; if (target->key < key) return stFind(target->left, key); else return stFind(target->right, key); } void stPrint(searchTree* t, int indent = 0){ if (t == nullptr) return; for (int i = 0; i < indent; ++i) cout << " "; cout << t << ' ' << t->key << endl; stPrint(t->left, indent + 1); stPrint(t->right, indent + 1); } void stCut(searchTree* &target, int key){ if (target == nullptr || target->key == key){ target = nullptr; return; } if (target->key < key) stCut(target->left, key); else stCut(target->right, key); }
stFind рд╡рд╛рдВрдЫрд┐рдд рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдмрдЯреНрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рджреЗрддрд╛ рд╣реИ, StPrint рд╕рдмрдЯреНрд░реАрдЬрд╝ рдХреА рдХреБрдВрдЬрд┐рдпреЛрдВ рдФрд░ рдкрддреЛрдВ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ, stCut рдЙрд╕ рд╕рдмрдЯреНрд░реА рдХреЛ рдХрд╛рдЯрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреБрдВрдЬреА рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреА рд╣реИред
рдЕрдВрдд рдореЗрдВ, рдореБрдЦреНрдп
int main(){ gcInit(); stackRef<searchTree> root; stAdd(root.ref, 2); stAdd(root.ref, 1); stAdd(root.ref, 3); stAdd(root.ref, 6); stAdd(root.ref, 5); stAdd(root.ref, 4); stAdd(root.ref, 8); stackRef<searchTree> additionalRef; additionalRef.ref = stFind(root.ref, 3); cout << "Before GC" << endl; cout << additionalRef.ref << ' ' << currentOffset << endl <<endl; stPrint(root.ref); cout << endl; gcCollect(); cout << "After GC" << endl; cout << additionalRef.ref << ' ' << currentOffset << endl << endl; stPrint(root.ref); cout << endl; stCut(root.ref, 5); gcCollect(); cout << "Deleted some elements and GC'd." << endl; cout << additionalRef.ref << ' ' << currentOffset << endl << endl; stPrint(root.ref); return 0; }
Before GC 0xd92058 224 0xd92018 2 0xd92058 3 0xd92078 6 0xd920d8 8 0xd92098 5 0xd920b8 4 0xd92038 1 After GC 0xd93108 224 0xd930e8 2 0xd93108 3 0xd93128 6 0xd93148 8 0xd93168 5 0xd93188 4 0xd931a8 1 Deleted some elements and GC'd. 0xd92038 160 0xd92018 2 0xd92038 3 0xd92058 6 0xd92078 8 0xd92098 1
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:
1. рд╣рдо рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╕рд░реНрдЪ рдЯреНрд░реА рднрд░рддреЗ рд╣реИрдВред
2. рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдХрдИ рд▓рд┐рдВрдХ рдкрд░ рдЬреАрд╕реА рдХреИрд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рддрддреНрд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕реНрдЯреИрдХ рд▓рд┐рдВрдХ рдмрдирд╛рдПрдВред
3. рдкреЗрдбрд╝, рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдФрд░ currentOffset рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВред
4. рдмреЗрдХрд╛рд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ред
5. рдкреЗрдбрд╝ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВред рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдмрд┐рдВрджреБ рдмрджрд▓ рдЧрдП рд╣реИрдВред
6. рдПрдХ рд╕рдмрдЯреНрд░реА рдЯреНрд░рд┐рдо рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХрд╣реЗрдВред рд╕рдм рдХреБрдЫ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдзреНрдпрд╛рди рджреЗрдВ рдХрд░рдВрдЯ рдСрдлрд╝рд╕реЗрдЯ рдХрдо рд╣реЛ рдЧрдпрд╛, рдФрд░ рдкреЗрдбрд╝ рдХреА рдЬрдбрд╝ рдЙрд╕реА рдкрддреЗ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдИ рдЬрд┐рд╕ рдкрд░ рд╡рд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдерд╛ред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕рд▓рд┐рдП C ++ рдореЗрдВ рдЖрдк Garbage рд╕рдВрдЧреНрд░рд╛рд╣рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЕрдкрдиреЗ рдЗрд░рд╛рджреЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдиреНрдпреВрдирддрдо рдУрд╡рд░рд╣реЗрдб рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рд╕реБрдВрджрд░ рд╣реВрдВред рдореИрдВ рдЙрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдЙрдкрдпреЛрдЧреА рд╣реЛред
рдкрд╣рд▓рд╛, рд╕рдВрдЧрдардирд╛рддреНрдордХ рдмрд┐рдВрджреБред
1. рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ - рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдмрд┐рд▓реНрдХреБрд▓ рд╢рд╛рдВрдд рдирд╣реАрдВ рд╣реИред рд╕рдм рдХреБрдЫ рдПрдХ рдорд╛рдирд╡ рд╡рд░реНрдЧ рдФрд░ / рдпрд╛ рд╕реА ++ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
2. рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдореЗрдВ рд╣реЗрдбрд░ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдЙрджрд╛рд╕реА рд╣реИред рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╕реЗ рдПрдХ рд╡рд┐рд░рд╛рд╕рдд рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП - getSize рдФрд░ getLayoutред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЛ рдЙрд╕ рд╕рд░рдгреА рдХрд╛ рд╕рдВрджрд░реНрдн рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ ("рд╕рднреА рд▓рд┐рдВрдХ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реИрдВ" рд╡рд╛рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЧрдВрднреАрд░ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ)ред рдЗрд╕ рд╕рд░рдгреА рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рднрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛ рд╕рд╡рд╛рд▓ рдСрдЯреЛрдореИрдЯрд┐рдХ рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рд╣реИред рдЬрдм рдЬреАрд╕реА рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕рд╛рдордиреЗ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рдХреБрдЫ рдХрд╣рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ gcCollect рдлрд╝рдВрдХреНрд╢рди, рд╕рдм рдХреБрдЫ рдЕрдкрдиреЗ рдЖрдк рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди C ++ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИред рдпрд╣ рдирд╛рдХ рдХреЗ рдиреАрдЪреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреВрд░реЗ рдкреНрд░рд╡рд╛рд╣, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рд┐рджреНрдз рд╣реИред рдпрд╣рд╛рдБ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдХрд╛ рдХреВрдбрд╝рд╛ рдХрдЪрд░рд╛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд▓рдЧрднрдЧ рд╡реИрдЪрд╛рд░рд┐рдХ рдЕрдкрд░рд╛рдз рд╣реИред рддреЛ, рдЗрд╕рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рджреЛ рдореЛрдб рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП:
1. рдкрд╛рд░рджрд░реНрд╢реАред
2. рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореЗрдореЛрд░реА рдХреЛрдЯрд╛ рдХреЗ рдердХрд╛рд╡рдЯ рдХреЗ рдмрд╛рдж рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдВред рдпрд╣рд╛рдВ рдпрд╣ рддрдп рдХрд░рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ рдХрд┐ рд╡рд╣ рдореЗрдореЛрд░реА рдХреЛ рдЬрдмрд░рджрд╕реНрддреА рд╣рдЯрд╛рдП рдпрд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗред
рдФрд░ рдПрдХ рд╕рд╡рд╛рд▓ред рдмрд╣реБ рд╕реВрддреНрд░рдгред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдЦрд░рд╛рдм рд╣реИред рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреБрдЫ рднреА рдЯреВрдЯ рди рдЬрд╛рдПред рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ рдЖрдзреЗ рдЬреЗрд╡реАрдПрдо рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдореБрдЭреЗ рдЙрд╕рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рд▓рдЧрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП, рдЖрдк рдмрд╕ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╕рдорд░реНрдкрд┐рдд рдЬреАрд╕реА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреЛ рдХреБрдЫ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдХрд┐рд╕реА рдиреЗ рд╕рд╛рдорд╛рдиреНрдп рд╢реЗрдпрд░реНрдб_рдкрд╛рд░реНрдЯ рдХреЛ рд░рджреНрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреЗ рдмрд┐рдирд╛, рдЬреАрд╡рди рдЖрдорддреМрд░ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдордЬреЗрджрд╛рд░ рд╣реЛрддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╕ рдиреЛрдЯ рдкрд░ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВред рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХрд┐рд╕реА рднреА рддреИрдпрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрдЧрдд рд╣реИред рдЙрдирдХреА рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреАред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ std :: list, std :: map рдФрд░ std :: рд╕реЗрдЯ рдХреЗрд╡рд▓ рддрднреА рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗ рдЬрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ GC рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреВрд╕реНрдЯ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдПрди рдЧреАрдЧрд╛рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд░реНрде рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЫреЛрдЯреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рдЦрдВрдбрди рдХрд╛ рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдРрд╕реА рдмрд╛рдд рдореБрдЭреЗ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд▓рдЧрддреА рд╣реИред
рдЖрдк
рдпрд╣рд╛рдБ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдЦреЗрд▓ рд╕рдХрддреЗ
рд╣реИрдВ ред