рдЧреЗрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ: рдереЛрдХ рдбреЗрдЯрд╛

рдЫрд╡рд┐

рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рд╕рдордЭ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдн рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдореИрдВ рдПрд╡реАрдПрд▓ рдкреЗрдбрд╝ , рд▓рд╛рд▓-рдХрд╛рд▓реЗ рдкреЗрдбрд╝ , рдЙрдкрд╕рд░реНрдЧ рдкреЗрдбрд╝ , рд╕реНрдХрд┐рдк рд╕реВрдЪреА , рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдХрднреА рдХрд╛рдо рдирд╣реАрдВ рдЖрдпрд╛ред рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП рдФрд░ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдП * рдкрде рдЦреЛрдЬ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрддрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдвреЗрд░) рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

рд░реЛрдЬрдорд░реНрд░рд╛ рдХреЗ рдХрд╛рдо рдореЗрдВ, рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реВрдВред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ, рд╡реЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдореЗрдВ рдЖрддреЗ рд╣реИрдВ:

  • рд╕рд╛рдЭрд╛ рдбреЗрдЯрд╛ рд╕рд░рдгрд┐рдпрд╛рдБ (рдмрд▓реНрдХ рдбреЗрдЯрд╛) - рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ред
  • рдХрдордЬреЛрд░ рд╕рдВрджрд░реНрдн (рдпрд╛ рд╣реИрдВрдбрд▓ ) - рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рдХреЗ рдмрд┐рдирд╛ рдмрд▓реНрдХ рдбреЗрдЯрд╛ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ред
  • рдЗрдВрдбреЗрдХреНрд╕ рдмрд▓реНрдХ рдбреЗрдЯрд╛ рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдмрд╕реЗрдЯ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред
  • рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдПрд░реЗрд╕ рдЧрддрд┐рд╢реАрд▓ рдЖрдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдереЛрдХ рдбреЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред

рдореИрдВ рдХрдИ рд▓реЗрдЦреЛрдВ рдХреЛ рд╕рдорд░реНрдкрд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдЗрди рд╕рднреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВред рдЪрд▓реЛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА - рдмрд▓реНрдХ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдмрд▓реНрдХ рдбреЗрдЯрд╛


рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрдж рдирд╣реАрдВ рд╣реИ (рдпрд╛ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ)ред рдореИрдВ рд╕рдорд╛рди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдХрд┐рд╕реА рднреА рдмрдбрд╝реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ " рдмрд▓реНрдХ рдбреЗрдЯрд╛ " рдХрд╣рддрд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

  • рдЦреЗрд▓ рдореЗрдВ рд╕рднреА рдЧреЛрд▓рд┐рдпрд╛рдВред
  • рдЦреЗрд▓ рдХреЗ рд╕рднреА рдкреЗрдбрд╝ред
  • рдЦреЗрд▓ рдореЗрдВ рд╕рднреА рд╕рд┐рдХреНрдХреЗред

рдпрд╛, рдпрджрд┐ рдЖрдк рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рдХреЛрдб рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

  • рдЦреЗрд▓ рдореЗрдВ рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВред
  • рдЦреЗрд▓ рдореЗрдВ рд╕рднреА рдЬрд╛рд▓ред
  • рдЦреЗрд▓ рдореЗрдВ рд╕рдм рд▓рдЧрддрд╛ рд╣реИред

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

  • рд╕рднреА рдзреНрд╡рдирд┐ рд╕рдВрд╕рд╛рдзрди рдЬрд┐рдиреНрд╣реЗрдВ рдмрдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред
  • рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рднреА рдзреНрд╡рдирд┐рдпрд╛рдБ рдмрдЬ рд░рд╣реА рд╣реИрдВред
  • рд╕рднреА рдкреНрд░рднрд╛рд╡ (рдХреНрд╖реАрдгрди, рд╕реНрд╡рд░ рдкрд░рд┐рд╡рд░реНрддрди, рдЖрджрд┐) рдзреНрд╡рдирд┐рдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред

рдмрд▓реНрдХ рдбреЗрдЯрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдиреВрдВрдЧрд╛:

  • рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рднрдВрдбрд╛рд░рдг рдХреНрд░рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдпрд╛рдиреА рд╣рдо рд╕рд░рдгреА рдХреЛ рдХрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред
  • рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ (рдкреАрдУрдбреА-рд╕рдВрд░рдЪрдирд╛) рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ memcpy() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдпрд╛ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдмреЗрд╢рдХ, рдЖрдк рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдХреНрд░рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рддрддреНрд╡реЛрдВ рдХреЛ рдирд┐рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ рд░рд┐рдбреНрд░рд╛рдКрдВрдбрд┐рдВрдЧ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЖрдЧреЗ рд╕реЗ рдкреАрдЫреЗ рдХреА рдУрд░ рдЫрд╛рдБрдЯрдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдбрд╛рдЯрд╛ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬреИрд╕реЗ рдХрд┐ рд▓рд╛рд▓-рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдпрд╛ рдмреА-рдЯреНрд░реА ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд╛рдордиреЗ рдХреА рдУрд░ рд╕реЗ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд░реНрдгрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╕реЙрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдлрд╝реНрд░реЗрдо рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдирд╛ рдорд╣рдВрдЧрд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдУ (рдПрди) рдореЗрдВ рд░реЗрдбрд┐рдХреНрд╕ рд╕реЙрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рдореИрдВ рдХреЗрд╡рд▓ рд╕рд░рд▓ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ C ++ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╕реЗ C ++ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реИрдВ рдЬрдм рдЖрдкрдХреЛ рдмрд▓реНрдХ рдбреЗрдЯрд╛ рдореЗрдВ рдХреБрдЫ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╛рд▓ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд╛рдо рдпрд╛ рд╕реВрдЪреАред рдореИрдВ рдЗрди рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛, рдЬрд╣рд╛рдВ рд╣рдо "рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ" рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд░рд▓, рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдХреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдБ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реА рдХрд╛рд▓реНрдкрдирд┐рдХ рдзреНрд╡рдирд┐ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдмрд▓реНрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдпрд╣рд╛рдВ рджреА рдЧрдИ рд╣реИрдВ:

 typedef struct { resource_t *resource; // Resource manager data uint64_t bytes; // Size of data uint64_t format; // Data format identifier } sound_resource_t; typedef struct { sound_resource_t *resource; // Resource that's playing uint64_t samples_played; // Number of samples played float volume; // Volume of playing sound } playing_sound_t; typedef struct { playing_sound_t *sound; // Faded sound float fade_from; // Volume to fade from float fade_to; // Volume to fade to double fade_from_ts; // Time to start fade double fade_to_ts; // Time to end fade } playing_fade_t; 

рдмрд▓реНрдХ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдХреБрдЫ рд▓рдХреНрд╖реНрдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

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

рдмрд▓реНрдХ рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рджреЛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХреЗ рдПрдХ рд╕реНрдерд┐рд░ рд╕рд░рдгреА рдпрд╛ C ++ рд╡реЗрдХреНрдЯрд░ рд╣реИрдВ:

 // Static array #define MAX_PLAYING_SOUNDS 1024 uint32_t num_playing_sounds; playing_sound_t playing_sounds[MAX_PLAYING_SOUNDS]; // C++ vector std::vector<playing_sound_t> playing_sounds; 

рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ, рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрд╡реЗрджрди рдореЗрдВ рдХрд┐рддрдиреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ , рддреЛ рдпрд╛ рддреЛ рдЕрдкрдиреА рд╕реНрдореГрддрд┐ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░ рджреЗрдВ рдпрд╛ рдЖрдк рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдмрд╛рд╣рд░ рднрд╛рдЧ рдЬрд╛рдПрдВрдЧреЗред

рд╡реЗрдХреНрдЯрд░ std::vector рднреА рдПрдХ рдмрд╣реБрдд рд╣реА рдпреЛрдЧреНрдп рдФрд░ рд╕рд░рд▓ рдЙрдкрд╛рдп рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдХреБрдЫ рдкрд╣рд▓реБрдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  • рдбрд┐рдмрдЧрд┐рдВрдЧ iterators рдХреЗ рдХрд╛рд░рдг рдбреАрдмрдЧ рдореЛрдб рдореЗрдВ Visual Studio рд╕реЗ std::vector рдХрд╛ рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдзреАрдорд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ _ITERATOR_DEBUG_LEVEL = 0 рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, std::vector рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдФрд░ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡реЗ memcpy() рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдзреАрдорд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
  • std::vector рдПрдХ рд╕рд╛рдзрд╛рд░рдг "рд╕реНрдЯреНрд░реЗрд░реА рдмрдлрд░" рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред

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

рд╣рдЯрд╛рдиреЗ рдХреА рд░рдгрдиреАрддрд┐


рдкрд╣рд▓рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд┐рд░реНрдгрдп: a[i] рд╡рд╕реНрддреБ рдХреЛ рд╣рдЯрд╛рддреЗ рд╕рдордп рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдБ рддреАрди рдореБрдЦреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

  • рдЦрд╛рд▓реА рд╕реНрд▓реЙрдЯ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдмрд╛рдж рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ a[i+1] тЖТ a[i] , a[i+2] тЖТ a[i+1] рдЖрджрд┐ рдореЗрдВ рд╢рд┐рдлреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рдЖрдк рд╕рд░рдгреА рдХреЗ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдХреЛ рдЦрд╛рд▓реА рд╕реНрд▓реЙрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: a[i] = a[n-1] ред
  • рдпрд╛ рдЖрдк рдРрд░реЗ рдореЗрдВ рдЫреЗрдж рдмрдирд╛рдХрд░ рд╕реНрд▓реЙрдЯ рдХреЛ рдЦрд╛рд▓реА рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЫреЗрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдж рдореЗрдВ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рднрдпрд╛рдирдХ рд╣реИ - рдЗрди рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рдЖрдВрджреЛрд▓рди рдкрд░ рдУ (рдПрди) рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рд╕рд░рдгреА рдХреЛ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рдСрд░реНрдбрд░ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИред рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрджреЗрд╢ рд╣рдореЗрдВ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдк a.erase() std::vector рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП a.erase() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдареАрдХ рдпрд╣реА рд╣реЛрдЧрд╛!

рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЕрдХреНрд╕рд░ "рд╕реНрд╡реИрдк-рдПрдВрдб-рдкреЙрдк" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк C ++ рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЖрдорддреМрд░ рдкрд░ рдЙрд╕ рддрддреНрд╡ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ (рд╕реНрд╡реИрдк рдХрд░рдиреЗ) рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рд╛рде рд╣рдЯрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрдВрддрд┐рдо рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛рдХрд░ рдпрд╛ рдкреЙрдк рдХрд░рдХреЗред

 std::swap(a[i], a[a.size() - 1]); a.pop_back(); 

рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ рдЬрд░реВрд░реА рд╣реИ? C ++ рдореЗрдВ, рдЕрдЧрд░ рд╣рдо a[i] = a[n-1] рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ , рддреЛ рд╣рдореЗрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ a[i] рдХреЛ рдЙрд╕рдХреЗ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рд╣рдЯрд╛рдХрд░, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ i рд╕реНрдерд┐рддрд┐ рдореЗрдВ a[n-1] рдХреЙрдкреА рдмрдирд╛ i рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рд╡реЗрдХреНрдЯрд░ рдХреЛ рд╢рд┐рдлреНрдЯ рдХрд░рддреЗ рд╕рдордп рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ a[n-1] ред рдпрджрд┐ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдмреБрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдмрдЬрд╛рдп std::swap рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХреЗрд╡рд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдореВрд╡ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореЗрдореЛрд░реА рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдлрд┐рд░, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕реА ++ рдореИрдВ рд╕рд░рд▓ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рд╕реА рдСрдкрд░реЗрд╢рдиреНрд╕ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рд╕реА ++ рдореЗрдВ рдХрдИ рдкреНрд░рджрд░реНрд╢рди рдиреБрдХрд╕рд╛рди рд╣реИрдВ рдЬреЛ рдЖрдк рдЕрдВрджрд░ рдЧрд┐рд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдЕрдВрджрд░ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рд╕реА рдореЗрдВ, рд╕реНрд╡реИрдк-рдорд┐рдЯрд╛ рдСрдкрд░реЗрд╢рди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдЧрд╛:

 a.data[i] = a.data[--an]; 

рд╕реНрд╡реИрдк-рдПрдВрдб-рдкреЙрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХрд╕рдХрд░ рдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдирдИ рд╡рд╕реНрддреБ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЗрд╕реЗ рд╕рд░рдгреА рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВред

рдпрджрд┐ рд╣рдо "рдЫреЗрдж рд╡рд╛рд▓реЗ" рд╡рд┐рдХрд▓реНрдк I рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рд░рдЦрддреЗ рд╕рдордп рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдореБрдлреНрдд "рдЫреЗрдж" рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рд░рдгреА рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХреЗрд╡рд▓ рддрдм рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдЬрдм рдХреЛрдИ рдореБрдлреНрдд "рдЫреЗрдж" рди рд╣реЛред рдЕрдиреНрдпрдерд╛, рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдпрд╣ рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд▓ рддрдХ рдмрдврд╝реЗрдЧрд╛ред

рдЖрдк рдЫреЗрдж рдкрджреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ std::vector<uint32_t> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдмреЗрд╣рддрд░ рдЙрдкрд╛рдп рд╣реИ рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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

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

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


рдкрд╛рд░рдВрдкрд░рд┐рдХ рдФрд░ рдЕрдВрдЧреВрдареА рдЬреБрдбрд╝реА рд╣реБрдИ рд╕реВрдЪреАред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд╕реВрдЪреА рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдХреЗ рдХреЛрдб рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

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

рдЖрдк рд╣рдореЗрд╢рд╛ рд╕реВрдЪреА рд╕реНрд▓реЙрдЯ 0 рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдХреЗ рд╕реВрдЪреА рд╢реАрд░реНрд╖рдХ рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рди рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 // The objects that we want to store: typedef struct {...} object_t; // An item in the free list points to the next one. typedef struct { uint32_t next_free; } freelist_item_t; // Each item holds either the object data or the free list pointer. typedef union { object_t; freelist_item_t; } item_t; typedef struct { std::vector<item_t> items; } bulk_data_t; void delete_item(bulk_data_t *bd, uint32_t i) { // Add to the freelist, which is stored in slot 0. bd->items[i].next = bd->items[0].next; bd->items[0].next = i; } uint32_t allocate_slot(bulk_data_t *bd) { const uint32_t slot = bd->items[0].next; bd->items[0].next = bd->items[slot].next; // If the freelist is empty, slot will be 0, because the header // item will point to itself. if (slot) return slot; bd->items.resize(bd->items.size() + 1); return bd->items.size() - 1; } 

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

рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╕рдордп, рджреЛ рдкрд╣рд▓реБрдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

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

рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирдирд╛ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

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

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

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


рдереЛрдХ рдбреЗрдЯрд╛ рд╣рдЯрд╛рдиреЗ рдХреА рд░рдгрдиреАрддрд┐рдпрд╛рдБред

рдХрдордЬреЛрд░ рд╕рдВрдХреЗрдд


рдПрдХ рдиреЛрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдореЗрд░рд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдмрд▓реНрдХ рдбреЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП "рдХрдордЬреЛрд░ рдкреЙрдЗрдВрдЯрд░реНрд╕" рдпрд╛ "рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░" рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

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

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

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

 typedef struct { uint32_t id; uint32_t generation; } weak_pointer_t; 

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

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

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЪреВрдВрдХрд┐ generation рдХреНрд╖реЗрддреНрд░ рдЫреЗрдж рдФрд░ рдореМрдЬреВрджрд╛ рд╡рд╕реНрддреБрдУрдВ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рдВрдШ рдХреЗ рдмрд╛рд╣рд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 typedef struct { uint32_t generation; union { object_t; freelist_item_t; }; } item_t; 

рд╡рд┐рддрд░рдг рдХреА рд░рдгрдиреАрддрд┐


рдпрджрд┐ рдЖрдк рддрддреНрд╡ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП std::vector рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЬрдм рд╕рд░рдгреА рдкреВрд░реА рд╣реЛ рдЬрд╛рддреА рд╣реИ рдФрд░ рдЙрд╕реЗ рдмрдврд╝рд╛рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рддреЛ рддрддреНрд╡реЛрдВ рдХреЗ рдкреВрд░реЗ рд╕рд░рдгреА рдХреЛ рдкреБрдирд░реНрд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореМрдЬреВрджрд╛ рдЖрдЗрдЯрдо рдирдП рд╕рд░рдгреА рдореЗрдВ рдХреЙрдкреА рдХрд┐рдП рдЧрдП рд╣реИрдВред

std::vector рдЬреНрдпрд╛рдорд┐рддреАрдп рд░реВрдк рд╕реЗ рдмрдврд╝рддрд╛ рд╣реИ ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╡рд┐рддрд░рд┐рдд рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреБрдЫ рдХрд╛рд░рдХ (рдЖрдорддреМрд░ рдкрд░ ├Ч 2) рд╕реЗ рдЧреБрдгрд╛ рд╣реЛрддреА рд╣реИред рдЬрд┐рдпреЛрдореЗрдЯреНрд░рд┐рдХ (рдШрд╛рддреАрдп) рд╡реГрджреНрдзрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд░рдгреА рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рд▓рд╛рдЧрдд рдХреЛ рд╕реНрдерд┐рд░ рд░рдЦрддрд╛ рд╣реИред

рд╕рд░рдгреА рдХреЛ рдкреБрдирд░реНрд╡рд┐рддрд░рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдУ (рдПрди) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рд╕рд░рдгреА рдмрдврд╝рддреА рд╣реИ, рд╣рдо рджреВрд╕рд░реЗ n рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЖрдХрд╛рд░ рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬрдм рддрдХ рд╣рдо рдЗрд╕рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рддрддреНрд╡ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддрдм рддрдХ рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд╕рд░рдгреА рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдпрд╣реА рд╣реИ, рд╡реГрджреНрдзрд┐ рдХреА рд▓рд╛рдЧрдд O (n) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдХреЗрд╡рд▓ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдиреЗ рдХреЗ nth рд╕рдордп рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ * O (n) * рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдФрд╕рддрди рдПрдХ рддрддреНрд╡ рд▓рд┐рдЦрдиреЗ рдХреА рд▓рд╛рдЧрдд O (n) / O (n) = рд╣реИ рдУ (рез) ред

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


std::vector рд▓рд┐рдЦрдиреЗ рдХреА рд▓рд╛рдЧрдд std::vector ред

рдЖрдЗрдП рдпрд╣ рднреА рджреЗрдЦреЗрдВ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдЬреНрдпрд╛рдорд┐рддреАрдп рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рдорд╛рди рд▓реАрдЬрд┐рдП, рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдореЗрдореЛрд░реА рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдмрд╕ рдПрдХ рдФрд░ 128 рд╕реНрд▓реЙрдЯ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рдкреБрд░рд╛рдиреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрднреА рднреА O (n) рдХрд╛ рдЦрд░реНрдЪ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ 128 рдЖрдЗрдЯрдо рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐, рдФрд╕рдд рд▓рд╛рдЧрдд рдЕрдм O (n) / O (128) = O (n) рд╣реЛрдЧреА ред рдХрд┐рд╕реА рд╕рд░рдгреА рдореЗрдВ рдПрдХ рддрддреНрд╡ рд▓рд┐рдЦрдиреЗ рдХреА рд▓рд╛рдЧрдд рд╕рд░рдгреА рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрдиреБрдкрд╛рддрд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рд╕рд░рдгреА рдмрдбрд╝реА рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдпрд╣ рдХрдЫреБрдП рдХреА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддреА рд╣реИред рдКрдкреНрд╕!

std::vector рд╡рд┐рддрд░рдг рд░рдгрдиреАрддрд┐ рдПрдХ рдЕрдЪреНрдЫрд╛ рдорд╛рдирдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

  • Amortized Constant рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╕рд░рдгреА рд╣реИ, рддреЛ рдХрд╣реЛ, рд╕реИрдХрдбрд╝реЛрдВ рд▓рд╛рдЦреЛрдВ рддрддреНрд╡ рд╣реИрдВ, рдлрд┐рд░ рдЗрд╕ рд╕рд░рдгреА рдХреЛ рдмрдврд╝рд╛рдирд╛ рдФрд░ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдлреНрд░реЗрдо рджрд░ рдХреЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдордВрджреА рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдЦреЗрд▓реЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдФрд╕рдд рд▓рд╛рдЧрдд рдХрд┐рддрдиреА рдХрдо рд╣реИ, рдЕрдЧрд░ рдХреБрдЫ рдлреНрд░реЗрдо рдореЗрдВ рд▓рд╛рдЧрдд рдХреВрдж рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЦреЗрд▓ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  • рдЗрд╕реА рддрд░рд╣, рдмрдбрд╝реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдЖрд╡рдВрдЯрди рд░рдгрдиреАрддрд┐ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕реНрдореГрддрд┐ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░ рд╕рдХрддреА рд╣реИред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 16 рдорд┐рд▓рд┐рдпрди рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдПрдХ рдФрд░ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рд╕рд░рдгреА рдХреЛ 32 рдорд┐рд▓рд┐рдпрди рддрдХ рдмрдврд╝рд╛ рджреЗрдЧрд╛ред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд░рдгреА рдореЗрдВ 16 рдорд┐рд▓рд┐рдпрди рддрддреНрд╡ рд╣реИрдВ рдЬреЛ рд╣рдо рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХрдо рдореЗрдореЛрд░реА рд╡рд╛рд▓реЗ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП, рдпрд╣ рдмрд╣реБрдд рдХреБрдЫ рд╣реИред
  • рдЕрдВрдд рдореЗрдВ, рдкреБрдирдГ рдкреНрд░рд╛рдкреНрддрд┐ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реБрдП, рдореЗрдореЛрд░реА рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реЗ рдЬрд╛рддреА рд╣реИред рдпрд╣ рдмрдЧреНрд╕ рдХрд╛ рдПрдХ рд╕реНрд░реЛрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдЙрди рдмрдЧреЛрдВ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓реЗ рдЬрд╛рдиреЗ рдкрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

 // Create two items and return the sum of their costs. float f(bulk_data_t *bd) { const uint32_t slot_1 = allocate_slot(bd); item_t *item_1 = &bd->items[slot_1]; const uint32_t slot_2 = allocate_slot(bd); item_t *item_2 = &bd->items[slot_2]; return item_1->cost + item_2->cost; } 

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

рдЗрд╕ рддрд░рд╣ рдХреА рд╕реНрдерд┐рддрд┐ рдЗрд╕ рддрдереНрдп рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдмрдЧ рдХреЗрд╡рд▓ рддрднреА рдмрд╛рд╣рд░ рдЖрдПрдЧрд╛ рдЬрдм рд╕рд░рдгреА рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ slot_2 рдореЗрдВ рдкреБрдирд░реНрд╡рд┐рддрд░рд┐рдд slot_2 ред рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдХреБрдЫ рд╡рд┐рддрд░рдг рдкреИрдЯрд░реНрди рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдмрдЧ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рддрд░рдг рд░рдгрдиреАрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рджрд┐рдП рдЧрдП рд╣реИрдВ:

  • : 16, 32, 64, тАж, . , 16 , 32 , .тАж , std::vector .
  • , . , . . , O(n) push() , .
  • , , , , .

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

, тАФ ? , . , 16 , 16 , . , , 50 %. .

, , , . *16 K * n*, n тАФ bulk data , , ( ).

. -, , blocks\[i / elements_per_block\][i % elements_per_block] . -, , (heap allocator), .

, ┬л ┬╗, - std::vector , , . , , .

, , ID . , , . , 64 , 32 (4 тАФ ).





(Array of Structures, AoS) (Structure of Arrays, SoA). . , , , , :

 typedef struct { float t; vec3_t pos; vec3_t vel; vec3_t col; } particle_t; 

struct . ┬л ┬╗. :

 uint32_t num_particles; particle_t *particles; 

, .

(SoA) struct:

 uint32_t num_particles; typedef struct { float *t; vec3_t *pos; vec3_t *vel; vec3_t *col; } particles; 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдЖрдЧреЗ рднреА рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ vec3_tрдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ:

 uint32_t num_particles; typedef struct { float *t; float *pos_x; float *pos_y; float *pos_z; float *vel_x; float *vel_y; float *vel_z; float *col_r; float *col_g; float *col_b; } particles; 

рдпрд╣ рд╣рдорд╛рд░реА рдореВрд▓ рдПрдУрдПрд╕ рдпреЛрдЬрдирд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХреНрдпреЛрдВ рд╣реИ? рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рдорд░реНрдерди рдореЗрдВ рджреЛ рддрд░реНрдХ рд╣реИрдВ:

  • рдХреБрдЫ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗрд╡рд▓ рдЦреЗрддреЛрдВ рдХреЗ рдПрдХ рд╕рдмрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо tick()рдХреЗрд╡рд▓ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ tред рдПрд▓реНрдЧреЛрд░рд┐рдердо simulate_physics()рдХреЗрд╡рд▓ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ posрдФрд░ velред SoA рдпреЛрдЬрдирд╛ рдореЗрдВ, рдХрд┐рд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХреЗрд╡рд▓ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдореЗрдореЛрд░реА (рдЬреЛ рдХрд┐ рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИ) рддрдХ рд╕реАрдорд┐рдд рд╣реИрдВ , рддреЛ рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝рдВрдХреНрд╢рди tick()рдореЗрдореЛрд░реА рдХреЗ рдХреЗрд╡рд▓ 1/10 рднрд╛рдЧ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕реЗ 10 рдмрд╛рд░ рддреНрд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
  • SoA SIMD . , FPU . AVX float , 8 .

, tick() 80 ? рдирд╣реАрдВред 10 , , , SIMD .

SoA:

  • .
  • , .
  • particle_t * , . .
  • ,
  • ( ), . , .

, , struct , VM ( ). - 10 struct . 8- -, , . !

тАФ SIMD. :

 uint32_t num_particles; typedef struct { float t[8]; float position_x[8]; float position_y[8]; float position_z[8]; float velocity_x[8]; float velocity_y[8]; float velocity_z[8]; float color_r[8]; float color_g[8]; float color_b[8]; } eight_particles_t; eight_particles_t *particles; 

- SIMD- , -, . , .

tick() 32 , 288 , 32 .. , 10- , t . -, - 64 , , , 5 . , , -, 100% .

, . , [16] , float - . , , , :


AoS SoA.

, SoA тАФ ┬л ┬╗, SIMD , ( ┬л┬╗).

SIMD- ┬л┬╗ , , , ┬л┬╗ . , , , . next , SIMD- . struct.

, , , struct . , , .

AoS SoA, , . ┬л┬╗ AoS SoA , SIMD-, , . .

тАФ AoS SoA - . , AoS SoA, , AoS ( ). , , .

, ┬л ┬╗. 16- , SoA, . scratch buffer 16 .

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


, ┬л ┬╗ bulk data :

┬л┬╗ , VM ( ), ( 16 , ).

, :

, 8 SIMD VM .

.

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


All Articles