рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдХрд░ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреА рдШрдЯрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдВ рдХреЛрдИ рдкреЛрд╕реНрдЯ рдирд╣реАрдВ рд╣реИред рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдЬрдЯрд┐рд▓ рд╕реА ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХрдо рд╕реЗ рдХрдо рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд╣рд╛рдБред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЪрддреБрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдЕрд╡рд╕рд░ рджреЗ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЦрд░рд╛рдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдмрдврд╝реЗ рд╣реБрдП рдЖрд▓рд╕реНрдп рдХреАрдбрд╝реЗ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗ рд╕рдХрддрд╛ рд╣реИред рдХрдЯрд░ рдХреЗ рддрд╣рдд, рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп "рд╕рдВрдХрд▓рдХ рд╡рд╛рдкрд╕ рдорд╛рд░рддрд╛ рд╣реИ", рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЖрдЬ, рдПрдХ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЬреАрд╕реАрд╕реА рд╣реИ)ред
рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреНрдпрд╛ рд╣реИ? рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдХ рд╣реА рдореЗрдореЛрд░реА рд▓реЛрдХреЗрд╢рди рдкрд░ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреЙрдЗрдВрдЯрд░реНрд╕ рджрд┐рдЦрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред
int A; int * B = &A; int * C = &A;
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЪрд░ рдП рдореЗрдВ рдЕрдЪрд╛рдирдХ
рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдо (рдЙрдкрдирд╛рдо) рд╣реИрдВ: рдП, * рдмреА, * рд╕реАред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдиреВрдиреА рдХреЛрдб рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рднреА 3 рдирд╛рдореЛрдВ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдЧрд╛, рдЕрдЧрд░ A рдХреЛ рдХреБрдЫ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ * B рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╕реЗ рдкрдврд╝рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред
рдЕрдиреБрдХреВрд▓рди рдФрд░ __restrict рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдПрдХ рдЫреЛрдЯреА рд╕реА рдмрд╛рдд рдХреЛ рдЫреЛрдбрд╝рдХрд░: рд╕рдВрднрд╡ рдЕрдиреБрдХреВрд▓рдиред рд╕рдВрдХрд▓рдХ рдХреЛ рд╕рдордЭрдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХреЗрд╡рд▓ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рджреГрд╢реНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд▓реНрдХрд┐ рдпрд╣ рднреА рдХрд┐ рдЬрд╣рд╛рдВ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдЙрдкрдирд╛рдо рдХреЛ рдирд╣реАрдВ рдорд╛рдирддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред
void SumIt ( int * out, const int * in, int count ) { for ( int i=0; i<count; i++ ) (*out) += *in++; }
рдмрд╛рд╣рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп, рдХреБрдЫ рднреА рдкрд░реЗрд╢рд╛рдиреА рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╣ рд╣реИ рдХрд┐рд╕реА рдиреЗ рднреА рд╕рдВрдХрд▓рдХ рдХреЛ рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреА рдХрд┐ * рдЖрдЙрдЯ рдПрдбреНрд░реЗрд╕ * рдкрд░ рдЖрдЙрдЯ-рд╡реЗрд░рд┐рдПрдмрд▓ рдирд┐рд░реНрдгрд╛рдпрдХ рд░реВрдк рд╕реЗ * рдЗрди-рдПрдбреНрд░реЗрд╕ рдкрд░ рдЗрди-рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рд╕реЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдЦреБрдж рдЗрд╕ рддрд░рд╣ рдХреА рдзрд╛рд░рдгрд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ: рдЖрдк рдХрднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХреИрд╕реЗ рдФрд░ рдХреНрдпреЛрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ? рдЗрд╕рд▓рд┐рдП, рдЖрдВрддрд░рд┐рдХ рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, * рдореЗрдореЛрд░реА рдХреЛ рд╡рд╛рдкрд╕ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдЕрдзрд┐рдХрддрдо рд╕реНрддрд░ рдкрд░ рднреАред рдбрд┐рд╕рдорд┐рд╕ (gcc -O3 -S, 4.4.3, ubuntu x64) рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
.L7: addq $4, %rax addl (%rsi), %ecx cmpq %rdx, %rax movq %rax, %rsi movl %ecx, (%rdi) ; <-- ! jne .L7
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдмрд╛рд╣рд░ рдХреЗ рд╕рд╛рде рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдорд╛рдирд╡рддрд╛
__restrict рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛ред
void SumIt ( int * __restrict out, const int * __restrict in, int count ) { for ( int i=0; i<count; i++ ) (*out) += *in++; }
.L14: addq $4, %rax addl (%rsi), %ecx cmpq %rdx, %rax movq %rax, %rsi jne .L14 movl %ecx, (%rdi)
рдЦреИрд░, рд╕реЛрдЪрд┐рдП, 1 рдирд┐рд░реНрджреЗрд╢? рдкреНрд░реЛрд╕реЗрд╕рд░ рдЕрдм рд╕реНрдорд╛рд░реНрдЯ рд╣реИрдВ, рдПрдХ рдореЛрдЯреА рдХреИрд╢ рдФрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╣реИред рдЗрд╕ рдорд┐рдиреА-рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд░рд┐рдХреЙрд░реНрдб, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рддреБрд░рдВрдд рдХреИрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдХреБрдЫ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирддрд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдВрддрд░ рднреА рдирд╣реАрдВ рдорд╛рдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
1783293664 in 103818 usec 1783293664 in 69818 usec
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВред рд╕рдВрднрд╡ред рдУрд╣, рддреНрд╡рд░рдг рд▓рдЧрднрдЧ 1.5 рдЧреБрдирд╛ рд╣реИред рдпрд╣рд╛рдВ рдХрднреА-рдХрднреА рдПрдХ рдирд┐рд░реНрджреЗрд╢ (рдФрд░ рджреЛ рд╕рдВрд╢реЛрдзрдХ) рдХреА рдХреАрдордд рд╣реЛрддреА рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рд╕рднреА рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рднрд░реА рд╣реБрдИ рдЖрдВрддрд░рд┐рдХ рдЫреЛрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИред
рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдФрд░ рдмрдЧреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдЕрдЪреНрдЫреА рдЧрддрд┐ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрди рд╡рд┐рдЪрд╛рд░реЛрдВ рд╕реЗ, C99 рдорд╛рдирдХ, рдФрд░ рдЗрд╕ C ++ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдПрдХ
рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдирд┐рдпрдо рдкреЗрд╢ рдХрд┐рдпрд╛ред рдорд╛рдирдХ рдкрдврд╝рдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдХреЗ рдХреМрд╢рд▓ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн: рдПрди 1 124, 6.5 (7)ред рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрдХреНрддрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣рд╛рдВ рджреЗрдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рдХреЛрдИ рд╕рдЦреНрдд рд╢рдмреНрдж рдпрд╛ рдЙрдкрдирд╛рдо рдирд╣реАрдВ рд╣реИред ;) (рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рдХреЗрд╡рд▓ рдЗрд╕реЗ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдлреБрдЯрдиреЛрдЯ рдирдВрдмрд░ 74 рдореЗрдВ рдЕрд▓рд┐рдпрд╛рд╕рд┐рдб рд╢рдмреНрдж рд╢рд╛рдорд┐рд▓ рд╣реИред) рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд░реНрде "рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░" рдХреЛ рдХрд╛рдлреА рд╕рд░рд▓ рд░реВрдк рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдореЛрдб рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ "рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рднрд┐рдиреНрди" рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХреА рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рд╣реА рдореЗрдореЛрд░реА рд╕реНрдерд╛рди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдЬреЛ рдмрд┐рд▓реНрдХреБрд▓ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдЬрдм рдмрд┐рдВрджреБ рдпрд╛ рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рджрд┐рдЦрддреЗ рд╣реИрдВ, рдпрд╛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдШрд╛рддрдХ рд░реВрдк рд╕реЗ, рдЬрдм рдкреЙрдЗрдВрдЯрд░реНрд╕ рдПрдХ рд╣реА рдореЗрдореЛрд░реА рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рдЗрдб-рд╕рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ gcc рд╣реЛрддрд╛ рд╣реИред
#include <stdio.h> typedef unsigned int DWORD; typedef unsigned short WORD; inline DWORD SwapWords ( DWORD val ) { WORD * p = (WORD*) &val; WORD t; t = p[0]; p[0] = p[1]; p[1] = t; return val; } int main() { printf ( "%d\n", SwapWords(1) ); return 0; }
рдпрд╣ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░реЛрдЧреНрд░рд╛рдо рдпрд╛ рддреЛ 65536 рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрдм g ++ test.cpp, рдпрд╛ 1 рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп g ++ -O3 test.cpp рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рдХреНрдпрд╛!?
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ -O2 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, -fstrict-aliasing рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЪрд╛рд▓реВ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ * рдкреА рдореВрд▓ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡реИрд▓ рдХрд╣рд╛рдБ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдФрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ, рдпрд╣ рд╡реНрдпрд╡рд╕рд╛рдп рдореГрддреНрдпреБ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ: рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рддрд░реНрдХ рдХрд╛ рдореВрд▓реНрдп рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛; рдЗрд╕рд▓рд┐рдП рд╕реНрд╡реЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ (1) рдХреЛ рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░ 1 рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рдорд╕реНрдпрд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ -Wall (рдпрд╛ рдХрдо-рд╕реЗ-рдХрдо рдирд┐рд░реНрдгрдп-рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ), рддреЛ рд╕рдВрдХрд▓рдХ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рдХреА рдЪреАрдЬреЛрдВ рдХреА рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдЧрд╛ред
test.cpp:8: warning: dereferencing pointer 'p.14' does break strict-aliasing rules
рдЬрд┐рд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдХрд┐рдВрдбрд░рдЧрд╛рд░реНрдЯрди рд╡рд┐рдзрд┐ рд╢рд╛рдкрд┐рдд рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ -fno- рд╕рдЦреНрдд-рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рд╣реИред рд╡реИрдзрд╛рдирд┐рдХ рд╕реБрдзрд╛рд░рд╛рддреНрдордХ рд╡рд┐рдзрд┐, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рдФрд░ рд╣рд░ рдЬрдЧрд╣ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рд╕рдВрдШ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореВрд▓реНрдп рдХреЛ рдлреИрд▓рд╛рдирд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рджрдпрд╛ рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдпрди рдлреАрд▓реНрдб рдХреЛ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд░рд╣рдиреЗ рджрд┐рдпрд╛ред рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рдЪрд╛рд▓ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдмрдЧрд╝рд▓ рдореЗрдВ (рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░) рдкрд░рд┐рдгрд╛рдо рджреЗ рд╕рдХрддреА рд╣реИ, gcc рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд┐рджреНрдзрд╛рдВрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдмрджрд▓рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд (-fstrict-aliasing)ред
inline DWORD SwapWords ( DWORD val ) { union { DWORD d; WORD v[2]; } u; ud = val; WORD t = uv[0]; uv[0] = uv[1]; uv[1] = t; return ud; }
рд░рд╛рд╣-рд░рд╛рд╣? рд▓реЗрдХрд┐рди рдЕрдлрд╕реЛрд╕, рдПрдХ рдЫреЛрдЯрд╛ рд╣реИ, рд▓реЗрдХрд┐рди:
-рд╡рд┐рд╕реНрддрд╛рд░-рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреБрдЫ рднреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ ред рдпрд╣ рдЙрди
рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╕рдВрдХрд▓рди рдореЛрдб рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЫреЛрдЯрд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдгрд╛рддреНрдордХ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИ (рдпрд╣ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реИ), рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдПрдХ рд╢рдмреНрдж рд▓реЗрдирд╛ рд╣реИ: рдХрд╛рдлреА рднрд░рд╛ рд╣реБрдЖ рдорд╛рдВрд╕, рдПрдХ рдлрдлреВрдВрдж рдпрд╛ рджреЛ, рдФрд░ рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдЪрддреБрд░рд╛рдИ рд╕реЗ рдкреНрд░рдЪреНрдЫрдиреНрди рд╣реИ рдФрд░ vorning рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдПрд╕рдЯреАрдПрд▓ рдФрд░ / рдпрд╛ рдмреВрд╕реНрдЯ рдХреЗ рд╕рдХреНрд░рд┐рдп рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЗ рд╡рд┐рд▓реНрд╕ рдореЗрдВ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдерд░реНрдб рдкрд╛рд░реНрдЯреАрдЬрд╝ рднреА рдЗрд╕ рдмрд╛рдд рдХреА рдЧрд╡рд╛рд╣реА рджреЗрддреА рд╣реИрдВ рдХрд┐ * * рд╢реВрдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд┐рдХ рдХреЗ рд╕рд╛рде рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрдо рд╕реЗ рдХрдо gcc 4.1.x рдкрд░ рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рджрдмрд╛ рджрд┐рдпрд╛, рдЬрдмрдХрд┐ рдХреБрдЯрд┐рд▓ рдХреЛрдб рдХреА рдкреАрдврд╝реА рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ, рдмрд┐рд▓реНрдХреБрд▓ред
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдкреЗрдВрдЪ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЗрд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред (рдареАрдХ рд╣реИ, рдЕрднреА рдирд╣реАрдВред) рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдиреБрдХреВрд▓рди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрдврд╝ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред
inline uint64_t GetIt ( const DWORD * p ) { return *(uint64_t*)p; } int main() { DWORD buf[10]; uint64_t t; buf[0] = 1; buf[1] = 2; t = GetIt(buf); buf[2] = 3; buf[3] = 4; printf ( "%d, %d, %d, %d\n", buf[0], buf[1], int(t>>32), int(t) ); return 0; }
рдпрд╣ рдлрд┐рд░ рд╕реЗ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ: 1, 2, 32573, -648193368ред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд╣рд╛рдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рдкреВрд░реНрдг рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛, рдпрд╣ рдареАрдХ рд╡рд╣реА рд╣реИ рдЬрд╣рд╛рдВ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрдХрд▓рдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдХрд┐ GetIt (buf) buf рдХреА рд╕рд╛рдордЧреНрд░реА рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП GetIt () рдХреЗ рд▓рд┐рдП рдПрдХ "рдХреЙрд▓" рдХреЛ рдкреЙрдк рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдлрд┐рдЯ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рдмрдлрд░ рднрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
mov (%rsp),%r8 ; t = GetIt(buf) ... movl $0x1,(%rsp) ; buf[0] = 1 movl $0x2,0x4(%rsp) ; buf[1] = 2 movl $0x3,0x8(%rsp) ; buf[2] = 3 movl $0x4,0xc(%rsp) ; buf[3] = 4 mov %r8d,%r9d ; r9 = int(t) shr $0x20,%r8 ; r8 = int(t>>32) callq 0x400510 <__printf_chk@plt>
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХреБрдЫ рд╡реИрд░рд┐рдПрдмрд▓ (рдпрд╛ рддреЛ рдмрд╣реБрдд рдкреБрд░рд╛рдирд╛ рдпрд╛ рдмрд╣реБрдд рдирдпрд╛) рдореЗрдВ рдПрдХ рдЕрдорд╛рдиреНрдп рдорд╛рди рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ ... рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдЬреЛ рдХреБрдЫ рднреА рд╣реЛрддрд╛ рд╣реИред рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдФрд░ рд╕рдлрд▓рддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рд▓реЗ рдмрдЧ рдХреЛ рдкрдХрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реИ: рд╕рдлрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЛ w1x рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ "рдмреНрд▓рд╛рдЗрдВрдб" рд╕реНрдерд╛рди рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреБрдХреВрд▓рди рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдкрд░рд┐рдгрд╛рдо w2x рдореЗрдВ рдкрдХрдбрд╝реЗ рдЬрд╛рдПрдВред
рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рд╕реЗ рдХреИрд╕реЗ рд▓рдбрд╝реЗрдВ? рдореБрдЭреЗ рдЙрдкрдпреБрдХреНрдд рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рдерд╛ рдХрд┐ рд╕рдВрдХрд▓рдХ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдкрдХрдбрд╝рддрд╛ рд╣реИ; рдЕрдм, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреБрдЪреНрдЫ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рднреА рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рд╕рд╛ рд▓рд┐рдкрдЯрд╛ рд╣реБрдЖ рд╣реИ (рдпрд╛ рд╢рд╛рдпрдж рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рднреА)ред рд▓рдбрд╝реЛ рдХреНрдпреЛрдВрдХрд┐
рдкреНрд░рд╛рд░реНрдердирд╛ рдФрд░ рдЙрдкрд╡рд╛рд╕ рдПрдХ рдХрдареЛрд░ рдЕрдиреБрд╢рд╛рд╕рди рд╣реИред рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛, рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВред рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ, рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреЗ рдЖрджрдореА рдХреЛ рд╕реЛрдЪреЗрдВ: рдЕрдЧрд░ рдПрдХ рд▓реЛрдордбрд╝реА рдЪрд▓ рд░рд╣реА рд╣реИ, рдЕрдЧрд░ рдПрдХ рдмрд╛рдЬ рдЙрдбрд╝ рд░рд╣рд╛ рд╣реИ, рдпрд╛ рдЕрдЧрд░ рдЕрд▓реНрдЧрд┐рдВрдЧ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред
рд╕рд╛рдЗрдб-рдиреЛрдЯ: рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдиреНрдп рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдФрд░ рдЪрд╛рд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдк рдХреЙрдорд░реЗрдб рдкрд░ рдХреНрд▓рд╛рд╕рд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдкреЛрд╕реНрдЯ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рдЗрдХ рдПрдХреНрдЯрди,
рд╕реЗрд▓рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ .beyond3d.com /
articles /
2006 /
06 /
understanding-strict-aliasing.htmlMSVC рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░, рдПрдордПрд╕ рдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдПрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд▓реА рд░реЗрдХ рдХреЗ рдмрд┐рдирд╛ рджреБрдирд┐рдпрд╛ рдореЗрдВ C99- рдЕрдиреБрд░реВрдк рдХреЛрдб рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдмрд╣реБрдд рдХрдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдЯрд┐рд▓рддрд╛ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдПрдХ рд╢реИрдХреНрд╖рд┐рдХ рдорд┐рд╢рди рдЬреАрд╕реАрд╕реА рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдареАрдХ рд╣реИ, рдХрднреА-рдХрднреА рдЪреБрдкрдЪрд╛рдк рднреА, рд▓реЗрдХрд┐рди рдПрдХ рджреВрд╕рд░рд╛, рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВред
рдЗрд╕рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд╛рд▓ рдФрд░ рд╕рдВрдХреЗрдд рдХреЗ рд▓рд┐рдП __restrict рдХреБрдЫ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдХрд╣реЛ, рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП SumIt (int64_t * out, const int * in, int count), рд╕рдЦреНрдд рдирд┐рдпрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░, gcc рдХреЛ "рдЕрдиреБрдорд╛рди" рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдмрд╛рд╣рд░ рдмреАрдЪ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ; MSVC рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреА рдЬрд╛рдПрдЧреАред рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╡рд╣ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рд╕рджрд╕реНрдп
рднреА рдЗрд╕ рд╕реВрдЪрдХ рдкрд░ рд╕реНрдерд┐рдд рдбреЗрдЯрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдкрд╛рд╢ рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░рдВрддрд░ рд╕рдВрджрд░реНрдн рд╕реНрдореГрддрд┐ рдХреЗ рдирд┐рд░рдВрддрд░ рдкреАрдбрд╝рд╛ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░
1. рдЖрдк рдПрдХ рдЖрдВрддрд░рд┐рдХ рд▓реВрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЙрдкрдирд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ __restrict рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рд░рдЦреЗрдВред
2. рд╕реВрдЪрдХ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ, рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдФрд░ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рджреБрд╖реНрдкреНрд░рднрд╛рд╡реЛрдВ рдХреА рдкрд░рдорд╛рдгреБ рдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рд░рдЦреЗрдВред
3. рдЬреАрд╕реАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ-рдПрд╕реНрдЯреНрд░рд┐рдВрдЬреЗрдВрдЯ-рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВ, рдЕрдирджреЗрдЦрд╛ рди рдХрд░реЗрдВ -рдкреВрд░рд╛ рдХрд░реЗрдВред
4. MSVC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд╕рдЦреНрдд-рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ-рд╢реИрд▓реА рдЕрдиреБрдХреВрд▓рди рдХреА рдордЬрдмреВрд░ рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВ, рд╣рд╛рде рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВред
5. рдЖрдкрдХреЛ рд╕рдЦреНрдд рдПрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рдЗрд╕реЗ рд╕реБрд▓рдЭрд╛рдПрдВ, рд╢рд╛рдпрдж рдПрдХ рдпреВрдмреА рдереНрд░реЗрдбред
6. рдХреНрдпрд╛ рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рджреА рдЬрд╛рддреА рд╣реИ? рд▓реЗрдХрд┐рди рд╡рд╣ рд╣реИред рдЧреЛрдлрд░ рдХреА рддрд░рд╣ред
6.1ред рдХрдВрдкрд╛рдЗрд▓рд░ рдЭреВрда, vorings рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИрдВ, -рдХрднреА-рдХрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдЪрд╛рд▓реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!), рд▓реЗрдХрд┐рди рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред
6.2ред рдЖрдк рдЦреБрдж рдкрд░ рдмрд┐рд▓реНрдХреБрд▓ рднреА рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреЗрд╡рд▓ рдмреЗрдВрдЪрдорд╛рд░реНрдХ, рдбрд┐рд╕реНрдорд╛рд╕, рдкреНрд░рд╛рд░реНрдердирд╛ рдФрд░ рдЙрдкрд╡рд╛рд╕ред