рд╡реГрджреНрдзрд┐ рд╡реЗрдХреНрдЯрд░ рддрддреНрд╡

рдХрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ std :: рд╡реЗрдХреНрдЯрд░ рддрддреНрд╡ рддреЗрдЬреА рд╕реЗ рдмрдврд╝реЗрдВрдЧреЗ - рдпрджрд┐ рд╡реЗ рдкреНрд░рдХрд╛рд░ uint8_t рдпрд╛ uint32tt рд╣реИрдВ ?

рдЕрдореВрд░реНрдд рд░реВрдк рд╕реЗ рддрд░реНрдХ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рджреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:

void vector8_inc(std::vector<uint8_t>& v) { for (size_t i = 0; i < v.size(); i++) { v[i]++; } } void vector32_inc(std::vector<uint32_t>& v) { for (size_t i = 0; i < v.size(); i++) { v[i]++; } } 

рдЖрдЗрдП рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ


рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд╣рдо рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╣рдо рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ (рдЗрд╕реЗ "рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рддрд░реНрдХ" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдЕрдзрд┐рдХ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд▓рдЧрддрд╛ рд╣реИ)ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдПрдХ рд╕рд╡рд╛рд▓ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ: рдЗрди рд╡реИрдХреНрдЯрд░реЛрдВ рдХрд╛ рдЖрдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ ?

рдЕрдЪреНрдЫрд╛, рдЪрд▓реЛ рдХреБрдЫ рдирдВрдмрд░ рдЪреБрдиреЗрдВред рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ 20,000 рддрддреНрд╡ рд╣реЛрдиреЗ рджреЗрдВред

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

рдЖрдк рдпрд╣ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ 20,000 рдЖрдЗрдЯрдо uint8_t рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП 20 Kbyte рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ рдФрд░ uint32_t рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП 80 Kbytes рд╣реИрдВред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡реЗ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЖрдзреБрдирд┐рдХ x86- рдЖрдзрд╛рд░рд┐рдд рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдХреЗ L1 рд╕реНрддрд░ рдХреИрд╢ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ - рдирд╣реАрдВред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ 8-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреБрд╢рд▓ рдХреИрд╢рд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╣реЗрдб рд╕реНрдЯрд╛рд░реНрдЯ рдорд┐рд▓реЗрдЧрд╛?

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡реИрд╢реНрд╡реАрдХрд░рдг рдХреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рдорд╛рдорд▓реЗ рдХреЗ рд╕рдорд╛рди рд╣реИ: рд▓реВрдк рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рдЬреНрдЮрд╛рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде, рд╕реНрдореГрддрд┐ рдореЗрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдерд┐рдд рддрддреНрд╡реЛрдВ рдкрд░ рдПрдХ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, 8-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ 32-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдПрдХ рдЬрдмрд░рджрд╕реНрдд рд▓рд╛рдн рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдСрдкрд░реЗрд╢рди рдЪрд╛рд░ рдмрд╛рд░ рдХрдИ рддрддреНрд╡реЛрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЗрдВрдЯреЗрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдПрдХрд▓-рдмрд╛рдЗрдЯ рддрддреНрд╡реЛрдВ рдкрд░ рд╡реЗрдХреНрдЯрд░ рдСрдкрд░реЗрд╢рди рдХреЛ рдЙрд╕реА рдЧрддрд┐ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ 32- рдмрд┐рдЯ рддрддреНрд╡ред

рдареАрдХ рд╣реИ, рд░реВрдХрдирд╛ рдмрдВрдж рдХрд░реЛред рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреА рдУрд░ рдореБрдбрд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

рдмреЗрдВрдЪрдорд╛рд░реНрдХ


рдореБрдЭреЗ gcc 8 рдкрд░ 20,000 рддрддреНрд╡реЛрдВ рдХреЗ рд╡реИрдХреНрдЯрд░ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреВрд▓рди рд╕реНрддрд░реЛрдВ рдХреЗ рд╕рд╛рде 8 рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдордп рдорд┐рд▓рд╛ рд╣реИ:


рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐, -O1 рд╕реНрддрд░ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, uint32_t рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг uint8_t рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬ рд╣реИ, рдФрд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: -O3 рд╕реНрддрд░ рдкрд░ gcc рдкрд░ 5.4 рдЧреБрдирд╛ рдФрд░ -O2 рдФрд░ -O2 рдФрд░ - рджреЛрдиреЛрдВ рд╕реНрддрд░реЛрдВ рдкрд░ рдареАрдХ 8 рдЧреБрдирд╛ред O3 ред рд╣рд╛рдВ, std :: рд╡реЗрдХреНрдЯрд░ рдореЗрдВ 32-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рдХреА рд╡реГрджреНрдзрд┐ рдорд╛рдирдХ рдЕрдиреБрдХреВрд▓рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рдВрдХрд▓рдХ рдкрд░ 8-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рдХреА рд╡реГрджреНрдзрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрда рдЧреБрдирд╛ рддреЗрдЬ рд╣реИред

рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЖрдЗрдП рд╣рдо рдЗрд╕ рдЖрд╢рд╛ рдореЗрдВ рдХреЛрдбрд╛рдВрддрд░рдг рд╕реВрдЪреА рдХреА рдУрд░ рдореБрдбрд╝реЗрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓реЗрдЧрд╛ред

рдпрд╣рд╛рдБ -O2 рд╕реНрддрд░ рдкрд░ gcc 8 рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ, рдЬрд╣рд╛рдБ 8-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг 32-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг (2) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ "рдХреЗрд╡рд▓" 1.5 рдЧреБрдирд╛ рдзреАрдорд╛ рд╣реИ:

8 рдмрд┐рдЯ:

 .L3: inc BYTE PTR [rdx+rax] mov rdx, QWORD PTR [rdi] inc rax mov rcx, QWORD PTR [rdi+8] sub rcx, rdx cmp rax, rcx jb .L3 

32-рдмрд┐рдЯ:
 .L9: inc DWORD PTR [rax] add rax, 4 cmp rax, rdx jne .L9 

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

рдпрд╣рд╛рдБ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ:

8 рдмрд┐рдЯ:

 .L3: inc BYTE PTR [rdx+rax] ;    v[i] mov rdx, QWORD PTR [rdi] ;  v.begin inc rax ; i++ mov rcx, QWORD PTR [rdi+8] ;  v.end sub rcx, rdx ; end - start (.. vector.size()) cmp rax, rcx ; i < size() jb .L3 ; .   i < size() 

рдпрд╣рд╛рдБ рд╡реЗрдХреНрдЯрд░ :: рдЖрд░рдВрдн рдФрд░ рд╡реЗрдХреНрдЯрд░ :: рдЕрдВрдд std :: рд╡реЗрдХреНрдЯрд░ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдмрд┐рдВрджреБ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ (7) рдХреЗ рд▓рд┐рдП рдЪреБрдиреЗ рдЧрдП рдХреНрд╖реЗрддреНрд░ рдХреЗ рднреАрддрд░ рдирд┐рд╣рд┐рдд рддрддреНрд╡реЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ, рдпреЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рди рдорд╛рди рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реЗрдХреНрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ :: рд╢реБрд░реВ () рдФрд░ рд╡реЗрдХреНрдЯрд░ :: рдЕрдВрдд () (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ)ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрджреЗрд╢ рд╡реЗрдХреНрдЯрд░ рдХреА рдЧрдгрдирд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВред рдЖрдХрд╛рд░ () ред рдпрд╣ рдЕрд╕рд╛рдорд╛рдиреНрдп рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ? рд▓реЗрдХрд┐рди рдЖрдЦрд┐рд░рдХрд╛рд░, 32-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдХрд╛рд░ () рдХреА рднреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпреЗ рдЖрджреЗрд╢ рдЙрд╕ рд╕реВрдЪреА рдореЗрдВ рдирд╣реАрдВ рдереЗред рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ () рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╣реБрдИ - рд▓реВрдк рдХреЗ рдмрд╛рд╣рд░ред

рддреЛ рдХреНрдпрд╛ рдмрд╛рдд рд╣реИ? рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрддреНрддрд░ рд╕реВрдЪрдХ рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рд╣реИ ред рдореИрдВ рдиреАрдЪреЗ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдЬрд╡рд╛рдм рджреВрдВрдЧрд╛ред

рд╡рд┐рд╕реНрддреГрдд рдЬрд╡рд╛рдм


рд╕рджрд┐рд╢ v рдХреЛ рд╕рдВрджрд░реНрдн рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдирдХрд╛рдмрдкреЛрд╢ рд╕реВрдЪрдХ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЕрдкрдиреЗ рдЖрдХрд╛рд░ рдХреЗ рдЖрдХрд╛рд░ () рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдХреНрдЯрд░ рдХреЗ :: v: start рдФрд░ v :: end рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдкрд░ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдХрд╛рд░ () рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдирд╣реАрдВ рд╣реИ: рдпрд╣ рд▓реВрдк рдХреЗ рдмрд╛рд╣рд░ рдЖрдХрд╛рд░ () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЕрдЧрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдореЗрдВ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд▓реВрдк рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╕реНрдерд╛рди рд╡реГрджреНрдзрд┐ v [i] ++ рд╣реИ ред рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдкрддреЗ рдкрд░ рд╣реЛрддреА рд╣реИред рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдСрдкрд░реЗрд╢рди рд╕реЗ рдЖрдХрд╛рд░ () рдХрд╛ рдореВрд▓реНрдп рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ?

рдпрджрд┐ рд░рд┐рдХреЙрд░реНрдб std :: рд╡реЗрдХреНрдЯрд░ <uint32_t> (рдпрд╛рдиреА uint32_t * рдкреЙрдЗрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛) рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдирд╣реАрдВ, рдпрд╣ рдЖрдХрд╛рд░ () рдорд╛рди рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдЯрд╛рдЗрдк uint32_t рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдк uint32_t рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдкреЙрдЗрдВрдЯрд░реНрд╕ () рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ (8) рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, uint8_t рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдо рд╕реЗ рдХрдо рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рдВрдХрд▓рдХ (9) рдкрд░, рдЙрддреНрддрд░ рдпрд╣ рд╣реЛрдЧрд╛: рд╣рд╛рдБ, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдХрд╛рд░ рдХрд╛ рдорд╛рди () рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ uint8_t рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо рд╣реИ, рдФрд░ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЪрд╛рд░ (рдФрд░ рдЪрд╛рд░ ) рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЙрдкрдирд╛рдо ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐, рд╕рдВрдХрд▓рдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, uint8_t рдкреЙрдЗрдВрдЯрд░реНрд╕ рдкрд░ рд▓рд┐рдЦрдирд╛ рдХрд┐рд╕реА рднреА рдкрддреЗ (10) рдкрд░ рдЕрдЬреНрдЮрд╛рдд рдореВрд▓ рдХреА рдореЗрдореЛрд░реА рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡реГрджреНрдзрд┐ рдСрдкрд░реЗрд╢рди v [i] ++ рдЖрдХрд╛рд░ () рдорд╛рди рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдЯреИрдб рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдИ рдЧрдИ рдореЗрдореЛрд░реА рдкрд░ рд▓рд┐рдЦрдирд╛ :: рд╡реЗрдХреНрдЯрд░ рдХрднреА рднреА рдЕрдкрдирд╛ рдЖрдХрд╛рд░ () рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗрдХреНрдЯрд░ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЕрдкрдиреЗ рд╣реА рдвреЗрд░ рдХреЗ рдЕрдВрджрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╡рд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд┐рдХрди рдФрд░ рдЕрдВрдбреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрднрд╡ рдФрд░ (11)ред рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ!

рдмрд╛рдХреА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?


рдареАрдХ рд╣реИ, рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ -O2 рд╕реНрддрд░ рдкрд░ uint8_ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг uint32_t рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд┐рд╢рд╛рд▓ рдЕрдВрддрд░ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреНрдпреЛрдВ - 8 рдЧреБрдирд╛ рддрдХ - рдХреНрд▓реИрдВрдЧ рдкрд░ рдпрд╛ рдПрдХ рд╣реА рдЬреАрд╕реА рдСрди- рдУ 3 ?

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: uint32_t рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ , рдХреНрд▓реИрдВрдЧ рд▓реВрдк рдСрдЯреЛ-рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬреЗрд╢рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

 .LBB1_6: ; =>This Inner Loop Header: Depth=1 vmovdqu ymm1, ymmword ptr [rax + 4*rdi] vmovdqu ymm2, ymmword ptr [rax + 4*rdi + 32] vmovdqu ymm3, ymmword ptr [rax + 4*rdi + 64] vmovdqu ymm4, ymmword ptr [rax + 4*rdi + 96] vpsubd ymm1, ymm1, ymm0 vpsubd ymm2, ymm2, ymm0 vpsubd ymm3, ymm3, ymm0 vpsubd ymm4, ymm4, ymm0 vmovdqu ymmword ptr [rax + 4*rdi], ymm1 vmovdqu ymmword ptr [rax + 4*rdi + 32], ymm2 vmovdqu ymmword ptr [rax + 4*rdi + 64], ymm3 vmovdqu ymmword ptr [rax + 4*rdi + 96], ymm4 vmovdqu ymm1, ymmword ptr [rax + 4*rdi + 128] vmovdqu ymm2, ymmword ptr [rax + 4*rdi + 160] vmovdqu ymm3, ymmword ptr [rax + 4*rdi + 192] vmovdqu ymm4, ymmword ptr [rax + 4*rdi + 224] vpsubd ymm1, ymm1, ymm0 vpsubd ymm2, ymm2, ymm0 vpsubd ymm3, ymm3, ymm0 vpsubd ymm4, ymm4, ymm0 vmovdqu ymmword ptr [rax + 4*rdi + 128], ymm1 vmovdqu ymmword ptr [rax + 4*rdi + 160], ymm2 vmovdqu ymmword ptr [rax + 4*rdi + 192], ymm3 vmovdqu ymmword ptr [rax + 4*rdi + 224], ymm4 add rdi, 64 add rsi, 2 jne .LBB1_6 

рдЪрдХреНрд░ 8 рдмрд╛рд░ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХрддрдо рдкреНрд░рджрд░реНрд╢рди рд╣реИ рдЬреЛ рдЖрдк рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдПрд▓ 1 рдХреИрд╢ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐ рдШрдбрд╝реА рдЪрдХреНрд░ рдореЗрдВ рдПрдХ рд╡реЗрдХреНрдЯрд░ (8 рддрддреНрд╡) (рдпрд╣ рдЕрдм рдШрдбрд╝реА рдЪрдХреНрд░ (12) рдкреНрд░рддрд┐ рдПрдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕реАрдорд╛ рдХреЗ рдХрд╛рд░рдг рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛)ред

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

рд╕рдмрд╕реЗ рдХрдо рд╕рдордп рдХреЛ рдСрдЯреЛ-рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: gcc рдЗрд╕реЗ рдХреЗрд╡рд▓ -O3 рд╕реНрддрд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреНрд▓реИрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ -O2 рдФрд░ -O3 рджреЛрдиреЛрдВ рд╕реНрддрд░реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред -Cc рд╕реНрддрд░ gcc рд╕рдВрдХрд▓рдХ рдХреНрд▓реИрдВрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдСрдЯреЛрд╡реИрдХреНрдЯрд░рд╛рдЗрдЬреНрдб рд▓реВрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд░реЗрдВ


рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ - рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

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

 for (auto i = v.begin(); i != v.end(); ++i) { (*i)++; } 

-O2 рд╕реНрддрд░ рдкрд░ gcc рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдЖрдХрд╛рд░ () рдХреЗ рд╡рд┐рдХрд▓реНрдк рд╕реЗ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛

 .L17: add BYTE PTR [rax], 1 add rax, 1 cmp QWORD PTR [rdi+8], rax jne .L17 

рджреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реАрдб рдСрдкрд░реЗрд╢рдВрд╕ рдПрдХ рдореЗрдВ рдмрджрд▓ рдЧрдП, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдо рд╡реЗрдХреНрдЯрд░ рдХреЗ рдЕрдВрддрд┐рдо рдкреЙрдЗрдВрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рдЗрдХрд▓ рдХреЛ рдЖрдХрд╛рд░ рджреЗрдиреЗ () рдХреЗ рдмрдЬрд╛рдп, рдПрдВрдб рдкреЙрдЗрдВрдЯрд░ рд╕реЗ рд╡реЗрдХреНрдЯрд░ рд╕реНрдЯрд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдШрдЯрд╛рддреЗ рд╣реИрдВред рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ, рдпрд╣ рдХреЛрдб uint32_t рдХреЗ рд╕рд╛рде рдкрдХрдбрд╝рд╛ рдЧрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реАрдб рдСрдкрд░реЗрд╢рди рдХреА рддреБрд▓рдирд╛ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рд╣реЛ рдЧрдИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рдорд╕реНрдпрд╛ рджреВрд░ рдирд╣реАрдВ рд╣реБрдИ рд╣реИ рдФрд░ рдСрдЯреЛ-рд╡реИрд░рд┐рдПрд╢рди рдЕрднреА рднреА рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИ, рдЗрд╕рд▓рд┐рдП uint8_t рдЕрднреА рднреА uint32_t рд╕реЗ рдХрд╛рдлреА рдкреАрдЫреЗ рд╣реИ - рджреЛрдиреЛрдВ gcc рдФрд░ clang рдкрд░ 5 рдЧреБрдирд╛ рд╕реЗ рдЕрдзрд┐рдХ рдЬрд╣рд╛рдВ рдСрдЯреЛ-рд╡реЗрдХреНрдЯрд░рдХрд░рдг рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЪрд▓реЛ рдХреБрдЫ рдФрд░ рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдлрд┐рд░ рд╕реЗ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдпрд╛ рдпреЛрдВ рдХрд╣реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдФрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╡рд┐рдзрд┐ рдорд┐рд▓реЗрдЧреАред

рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдо рд▓реВрдк рд╕реЗ рдкрд╣рд▓реЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЖрдХрд╛рд░ () рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ:

 for (size_t i = 0, s = v.size(); i < s; i++) { v[i]++; } 

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

 .L9: mov rdx, QWORD PTR [rdi] add BYTE PTR [rdx+rax], 1 add rax, 1 cmp rax, rcx jne .L9 

рдХреЗрд╡рд▓ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реАрдб рдСрдкрд░реЗрд╢рди рд╣реИ рдФрд░ рдХреЛрдИ рдЙрдк рдХрдорд╛рдВрдб рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдорд╛рдВрдб ( rdx, QWORD PTR [rdi] ) рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдЖрдХрд╛рд░ рдЧрдгрдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ? рдпрд╣ v рд╕реЗ рдбреЗрдЯрд╛ () рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ!

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ v [i] рдХреЛ * (v.data () + i) рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рджрд╕реНрдп рдбреЗрдЯрд╛ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ () (рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдирд┐рдпрдорд┐рдд рд╢реБрд░реБрдЖрдд рд╕реВрдЪрдХ) рдЖрдХрд╛рд░ () рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд╕рдЪ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЛ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ "рдореБрдХреНрдд" рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЕрднреА рднреА рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рдерд╛ред

рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдХреЗ рд╕рд╛рде рд╕рд╣рди, рд╣рдо рд▓рдЧрднрдЧ рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ред рдЖрдкрдХреЛ рдмрд╕ рд╣рдорд╛рд░реЗ рд▓реВрдк рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ std :: рд╡реЗрдХреНрдЯрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдкрд░ рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВред рдЗрд╕рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдореБрд╣рд╛рд╡рд░реЗ рдХреЛ рдПрдХ рдЖрдЗрдЯрд░ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ:

 for (auto i = v.begin(), e = v.end(); i != e; ++i) { (*i)++; } 

рдЕрдм рд╕рдм рдХреБрдЫ рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ (рдпрд╣рд╛рдВ рд╣рдо рдХреЗрд╡рд▓ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ uint8_t рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рдореЗрдВ рд╣рдо рд▓реВрдк рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдЕрдВрдд рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ, рджреВрд╕рд░реЗ рдореЗрдВ - рдирд╣реАрдВ):


рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рдмрджрд▓рд╛рд╡ рдиреЗ рд╣рдореЗрдВ рдСрдЯреЛ-рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕реНрддрд░реЛрдВ рдкрд░ рдЧрддрд┐ рдореЗрдВ 20 рдЧреБрдирд╛ рд╡реГрджреНрдзрд┐ рджреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, uint8_t рдХреЗ рд╕рд╛рде рдХреЛрдб рд╕рд┐рд░реНрдл uint32_t рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рд╕рд╛рде рдкрдХрдбрд╝ рдирд╣реАрдВ рдерд╛ - рдпрд╣ gcc -O3 рдФрд░ clang -O2 рдФрд░ -O3 рджреНрд╡рд╛рд░рд╛ рд▓рдЧрднрдЧ рдЗрд╕реЗ 4 рдмрд╛рд░ рд╕реЗ рдЖрдЧреЗ рдирд┐рдХрд▓ рдЧрдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЙрдореНрдореАрдж рдХреА рдереА, рд╡реИрд╢реНрд╡реАрдХрд░рдг рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реБрдП: рдЕрдВрдд рдореЗрдВ, рдареАрдХ рдЪрд╛рд░ рдмрд╛рд░ рдФрд░ рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдСрдкрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЪрд╛рд░ рдмрд╛рд░ рдХрдо рдмреИрдВрдбрд╡рд┐рдбреНрде рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдХреИрд╢ рд╕реНрддрд░ (13) рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ред

рдпрджрд┐ рдЖрдк рдЗрд╕ рдЬрдЧрд╣ рдкрд░ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рд╕рдордп рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЙрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

рд▓реЗрдХрд┐рди C ++ 11 рдореЗрдВ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдмреИрдВрдб рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреЗ рд▓рд┐рдП рд▓реВрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

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

рдЕрдЧрд░ рд╣рдордиреЗ рдЕрдЪрд╛рдирдХ рдкреНрд░рд╛рдЪреАрди рдЧреБрдлрд╛ рд╕рдордп рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдФрд░ рд╕реА-рд▓рд╛рдЗрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рддреЛ рдРрд╕рд╛ рдХреЛрдб рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛:

 void array_inc(uint8_t* a, size_t size) { for (size_t i = 0; i < size; i++) { a[i]++; } } 

рдпрд╣рд╛рдБ, рд╕рд░рдгреА a рдФрд░ рдЖрдХрд╛рд░ рдЪрд░ рдХрд╛ рд╕реВрдЪрдХ рдорд╛рди рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪрдХ a (14) - рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреА рддрд░рд╣ рд▓рд┐рдЦрдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдХреЛрдб рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдкрд┐рдЫрд▓реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддрд░рд╣ рд╣реА рд╣реИред

рдЕрдВрдд рдореЗрдВ, рд╕рдВрдХрд▓рдХ рдкрд░ рдЬрд╣рд╛рдВ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЖрдк __restrict (15) рдХреЗ рд╕рд╛рде рдПрдХ рд╡реЗрдХреНрдЯрд░ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 void vector8_inc_restrict(std::vector<uint8_t>& __restrict v) { for (size_t i = 0; i < v.size(); i++) { v[i]++; } } 

__Restrict рдХреАрд╡рд░реНрдб C ++ рдорд╛рдирдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди C99 ( рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд ) рдХреЗ рдмрд╛рдж рд╕реЗ C рдорд╛рдирдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдпрджрд┐ рдЗрд╕реЗ рд╕рдВрдХрд▓рдХ рдореЗрдВ C ++ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реА рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдЧрд╛, рд╕реА рдореЗрдВ рдХреЛрдИ рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдорд╛рдирд╕рд┐рдХ рд░реВрдк рд╕реЗ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рдХреЗ рд╕рд╛рде рд╡реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

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

рдирд┐рд░рд╛рд╢рд╛


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

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

рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ


рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЦреБрд╢реА рд╣реЛрдЧреАред рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдкреНрд░рдгрд╛рд▓реА (17) рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рд╣реИрдХрд░рдиреНрдпреВрдЬ рдкрд░ рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред

  1. рдпрд╣рд╛рдВ рдореЗрдореЛрд░реА рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рд╕реЗ, рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдореЛрд░реА рд╕реЗ рдЧреБрдЬрд░рддреА рд╣реИ: рдЙрд╕реА рдкрддреЗ рдкрд░ рдХрдорд╛рдВрдб рд▓рд┐рдЦреЗрдВ, рдЬрд┐рд╕реЗ рд╡рд╣рд╛рдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдЕрдВрддрд┐рдо рдорд╛рди рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдСрдкрд░реЗрд╢рди рдирд┐рд░реНрднрд░ рд╣реИрдВ (рдЕрднреНрдпрд╛рд╕ рдореЗрдВ, рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди) (рдПрд╕рдЯреАрдПрд▓рдПрдл) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдЕрдХреНрд╕рд░)ред рд╕реНрдореГрддрд┐ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░ рдРрдб рдХрдорд╛рдВрдб рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрддреЗ рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред
  2. рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЪрдХреНрд░ рдпрд╣рд╛рдБ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ; рд╕реНрдерд╛рдкрдирд╛ рдХреЛрдб рд╕рд░рд▓ рд╣реИ рдФрд░ рдпрд╣ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкреВрд░реА рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЛ рдЧреЙрдбрдмреЙрд▓реНрдЯ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ ред
  3. рд╢рд╛рдпрдж рдЗрд╕реЗ рдХреЗрд╡рд▓ "рдЫреЛрдЯрд╛" рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, gcc рд╕рдВрдХрд▓рдХ рдЖрдорддреМрд░ рдкрд░ -O2 рдФрд░ -O3 рд╕реНрддрд░реЛрдВ рдкрд░ рднреА рд▓реВрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЬрд╣рд╛рдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЫреЛрдЯреА рд╣реИ рдФрд░ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, gcc рдХреНрд▓реИрдВрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдб рдЖрдХрд╛рд░ рдкрд░ рдмрд╣реБрдд рдмрдЪрдд рдХрд░рддрд╛ рд╣реИред рдЖрдк рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдЕрдиреБрдХреВрд▓рди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдпрд╛ -funroll-loops рдзреНрд╡рдЬ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдХреЗ рд▓реВрдк рдХреЛ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  4. рджрд░рдЕрд╕рд▓, gcc рдореЗрдВ DWORD PTR [rax] рдХрдорд╛рдВрдб рдПрдХ рдорд┐рд╕реНрдб рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рд╣реИ: рдРрдб [rax], 1 рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ inc рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ 2 рд╕рдВрдпреБрдХреНрдд microoperations рдмрдирд╛рдо 3 рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдВрддрд░ рдХреЗрд╡рд▓ 6% рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЪрдХреНрд░ рдХреЛ рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдХреЗрд╡рд▓ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдСрдкрд░реЗрд╢рди рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдП, рддреЛ рдЕрдВрддрд░ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛ (рдЖрдЧреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдЕрдм рднреВрдорд┐рдХрд╛ рдирд╣реАрдВ рдирд┐рднрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо 1 рдХреА рд╕реАрдорд╛ рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рдПрдВрдЧреЗред рдкреНрд░рддрд┐ рдЪрдХреНрд░ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдСрдкрд░реЗрд╢рди, рдЬреЛ рдорд╛рдЗрдХреНрд░реЛ-рдСрдкрд░реЗрд╢рди рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред
  5. рдореИрдВ рдЗрд╕ рдЪрд░ рдХреЛ рдЖрдЧрдордирд╛рддреНрдордХ рдХрд╣рддрд╛ рд╣реВрдВ, рдФрд░ рд╕рд┐рд░реНрдл рдореИрдВ рд╣реА рдирд╣реАрдВ, рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдХреА рдЗрдХрд╛рдИ рд╕рдВрдЪрд╛рд▓рди рдХреЛ rax рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╕реВрдЪрдХ рдХреЗ 4-рдмрд╛рдЗрдЯ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛, рдФрд░ рддрджрдиреБрд╕рд╛рд░ рд▓реВрдк рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ред рдЕрдкрдиреЗ рдореВрд▓ рд░реВрдк рдореЗрдВ, рд╣рдорд╛рд░рд╛ рд▓реВрдк рд╡реЗрдХреНрдЯрд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕реВрдЪрдХ / рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдЪрд╛рд▓рди рдХреА рд▓рд╛рдЧрдд рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред
  6. рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдк -рдлреНрд░реВрди-рд▓реВрдк рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЬреАрд╕реАрд╕реА рдкрд░ рдЧрддрд┐ 8x рд░реЛрд▓- рдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐ рддрддреНрд╡ 1.08 рдЙрдкрд╛рдп рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди рдЗрд╕ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рднреА, рд╡рд╣ 8-рдмрд┐рдЯ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд▓реВрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ , рдЗрд╕рд▓рд┐рдП рдЧрддрд┐ рдореЗрдВ рдЕрдВрддрд░рд╛рд▓ рдФрд░ рднреА рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛!
  7. рдЗрди рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рдкрд╛рд╕ рдПрдХ рдирд┐рдЬреА рд╕рдВрд╢реЛрдзрдХ рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдирд╛рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди stdlibc ++ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдЯрд╛рд░реНрдЯ рдФрд░ рдлрд┐рдирд┐рд╢ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЬреАрд╕реАрд╕реА рдореЗрдВ рд╣реИред рдЙрдиреНрд╣реЗрдВ _Vector_base :: _ рд╡реЗрдХреНрдЯрд░_impl :: _ M_start рдФрд░ _Vector_base :: _ рд╡реЗрдХреНрдЯрд░_impl :: _ M_finish рдХреНрд░рдорд╢рдГ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЕрд░реНрдерд╛рддред _Vector_impl рд╕рдВрд░рдЪрдирд╛ рджрд░реНрдЬ рдХрд░реЗрдВ, рдЬреЛ _M__pl (рдФрд░ рдХреЗрд╡рд▓ рдПрдХ) _Vector_base рд╡рд░реНрдЧ рдХрд╛ рд╕рджрд╕реНрдп рд╣реИ , рдФрд░ рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, std :: рд╡реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╣реИред рдЕрдЪреНрдЫрд╛, рдЕрдЪреНрдЫрд╛! рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдореВрд░реНрдд рдХреЗ рдЗрд╕ рдвреЗрд░ рдХреЗ рд╕рд╛рде рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рддрд╛ рд╣реИред
  8. рдорд╛рдирдХ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ std рдХреЗ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИрдВ : рд╡реЗрдХреНрдЯрд░ рд╕рджрд╕реНрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди libstdc ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ Alloc :: рдкреЙрдЗрдВрдЯрд░ (рдЬрд╣рд╛рдВ рдПрд▓реЛрдХ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрд▓реЛрдХреЗрдЯрд░ рд╣реИ) рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдЯреИрдб :: рдЖрд╡рдВрдЯрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╡реЗ рдмрд╕ рдкреНрд░рдХрд╛рд░ рдЯреА * , рдХреЗ рд╕рдВрдХреЗрдд рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдирд┐рдпрдорд┐рдд рд╕рдВрдХреЗрдд - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ uint32_t * ред
  9. рдореИрдВ рдПрдХ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд░рдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдПрдХ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ uint8_t рдХреЛ рдЪрд╛рд░ , рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЪрд╛рд░ рдФрд░ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЪрд╛рд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдЪрд░рд┐рддреНрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ uint8_t рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдЧреИрд░-рдЪрд░рд┐рддреНрд░ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреЛрдИ рднреА рд╕рдВрдХрд▓рдХ рдЬреЛ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ: рдЙрди рд╕рднреА рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ uint8_t рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЪрд╛рд░ рдХрд╛ рдПрдХ рдЙрдкрдирд╛рдо рд╣реИ, рддрд╛рдХрд┐ рд╕рдВрдХрд▓рдХ рдЙрди рджреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рди рджреЗрдЦреЗрдВ, рднрд▓реЗ рд╣реА рд╡реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВред
  10. "рдЕрдЬреНрдЮрд╛рдд рдореВрд▓" рд╕реЗ рдореЗрд░рд╛ рддрд╛рддреНрдкрд░реНрдп рдпрд╣рд╛рдБ рдХреЗрд╡рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдХреЛ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╣рд╛рдБ рдЗрдВрдЧрд┐рдд рдХрд░ рд░рд╣реА рд╣реИ рдпрд╛ рдпрд╣ рдХреИрд╕реЗ рдкреНрд░рдХрдЯ рд╣реБрдИред рдЗрд╕рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдкреЙрдЗрдВрдЯрд░реНрд╕, рд╕рд╛рде рд╣реА рд╡реИрд╢реНрд╡рд┐рдХ рдФрд░ рд╕реНрдерд┐рд░ рдЪрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред , , , , , ( - ). , malloc new , , , , : , , . , malloc new .
  11. , std::vector - ? , std::vector<uint8_t> a a.data() placement new b . std::swap(a, b) , тАУ , b ? , b . : - (, ), , .
  12. 8 , .. 32 . , std::vector .
  13. - 4 : , , тАУ . : 8- L1, 32- тАУ L2 , .
  14. , тАУ : . , , ┬л┬╗.
  15. v[i] , .
  16. . , ┬л┬╗ , uint8_t . , , , uint8_t , . , clang, gcc , , uint8_t . - gcc , . , , - __restrict .
  17. - , , ( Disqus), ( ), .

. : Travis Downs. Incrementing vectors .

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


All Articles