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

рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреА рдЪрд┐рдВрддрд╛ рдХреНрдпреЛрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рд╣рдо рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдХрдбрд╝реЗ рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ, рдкреНрд░рдХрд╛рд░ рдХреА рдЪрдХрд╛рдЪреМрдВрдз, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдирд┐рдпрдореЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдХ рд╡рд╛рдХреНрдп рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рд╕рдЬрд╛ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП C ++ 20 рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдВрднрд╡ рд╕рд╣рд╛рдпрддрд╛ред рд╣рдо рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдирд┐рдпрдореЛрдВ рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдХреЗ рдЪрд░реНрдЪрд╛ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВрдЧреЗред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрджрд╛рд╣рд░рдгрдЖрдЗрдП рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╣рдо рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рдирдХ (рдиреЛрдВ) рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рд╕рдЦреНрдд рдЪреВрдХ рд╕реЗ рдХреИрд╕реЗ рдмрдЪреЗрдВ рдФрд░ рдЙрди рдЙрд▓реНрд▓рдВрдШрдиреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВ рдЬрд┐рдирд╕реЗ рд╣рдо рдЪреВрдХ рдЧрдП рдереЗред рдпрд╣рд╛рдБ
рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
int x = 10; int *ip = &x; std::cout << *ip << "\n"; *ip = 12; std::cout << x << "\n";
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ int * рд╣реИ рдЬреЛ рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╡реИрдз рдПрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рд╣реИред рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЛ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдИрдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ x рдХреЗ рдХрдмреНрдЬреЗ рд╡рд╛рд▓реЗ рдореВрд▓реНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рдореНрди
рдЙрджрд╛рд╣рд░рдг рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ:
int foo( float *f, int *i ) { *i = 1; *f = 0.f; return *i; } int main() { int x = 0; std::cout << x << "\n"; // Expect 0 x = foo(reinterpret_cast<float*>(&x), &x); std::cout << x << "\n"; // Expect 0? }
рдлреВ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо int * рдФрд░ float * рд▓реЗрддреЗ рд╣реИрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо foo рдХрд╣рддреЗ рд╣реИрдВ рдФрд░ рджреЛрдиреЛрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдПрдХ рд╣реА рдореЗрдореЛрд░реА рд╕реНрдерд╛рди рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рдЗрдВрдЯ рд╣реЛрддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
reinterpret_cast рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдерд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЙрд╕реЗ & x рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдлреНрд▓реЛрдЯ * рдХрд╛ рдкреНрд░рдХрд╛рд░ рдерд╛ред рд╣рдо рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рджреВрд╕рд░реА рдХреМрдЯ рдХрд╛ рдкрд░рд┐рдгрд╛рдо 0 рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЬрдм рдСрдкреНрдЯ-рдУ 2 рдФрд░ рдЬреАрд╕реАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдХреВрд▓рди рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреНрд▓реИрдВрдЧ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓реЗрдЧрд╛:
0
1
рдЬреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд, рд▓реЗрдХрд┐рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ред рдлреНрд▓реЛрдЯ рдПрдХ рдЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╡реИрдз рдЙрдкрдирд╛рдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдбреЗрд░реАрдлреЗрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рд╕рдВрдЧреНрд░рд╣реАрдд 1 рд╕реНрдерд┐рд░ рд░рд┐рдЯрд░реНрди рдореВрд▓реНрдп рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдПрдл рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдЪрдд рдХрд░рдиреЗ рд╕реЗ рдЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдореЗрдВ рдХреЛрдб рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рд╣реА рд╣реЛрддрд╛ рд╣реИ (
рдЙрджрд╛рд╣рд░рдг ):
foo(float*, int*):
рдЯрд╛рдЗрдк-рдмреЗрд╕реНрдб рдЕрд▓рд┐рдпрд╛рд╕ рдПрдирд╛рд▓рд┐рд╕рд┐рд╕ (TBAA) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ 1 рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╕реАрдзреЗ рдИрдПрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдирд┐рд░рдВрддрд░ рдорд╛рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИред TBAA рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднрд╛рд╖рд╛ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, TBAA рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдлреНрд▓реЛрдЯ рдЗрдВрдЯ рдХрд╛ рдПрдХ рдЙрдкрдирд╛рдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдореМрдд рдХреЗ рд▓рд┐рдП рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред
рдЕрдм рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдПрд╣рдо рдЬреЛ рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЬреЛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдорд╛рдирдХ рдХреНрдпрд╛ рдХрд╣рддрд╛ рд╣реИ? рдорд╛рдирдХ рднрд╛рд╖рд╛ рд╕реАрдзреА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдЕрд░реНрде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
C11 рдорд╛рдирдХ рдХреНрдпрд╛ рдХрд╣рддрд╛ рд╣реИ?
C11 рдорд╛рдирдХ рдкреИрд░рд╛ 7 рдХреЗ "6.5 рднрд╛рд╡" рдЦрдВрдб рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╣рддрд╛ рд╣реИ:
рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЕрдкрдирд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗрд╡рд▓ рд▓реИрд╡рд▓реНрдпреВ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ: 88) - рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рднрд╛рд╡реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдПрдХ рдкреНрд░рдХрд╛рд░,
int x = 1; int *p = &x; printf("%d\n", *p); //* p lvalue- int, int
- рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдпреЛрдЧреНрдп рд╕рдВрд╕реНрдХрд░рдг,
int x = 1; const int *p = &x; printf("%d\n", *p); // * p lvalue- const int, int
- рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдПрдХ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреЗ рдЕрдиреБрд░реВрдк рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдпрд╛ рдмрд┐рдирд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ,
int x = 1; unsigned int *p = (unsigned int*)&x; printf("%u\n", *p ); // *p lvalue- unsigned int,
Gcc / clang рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд▓рд┐рдП Footnote 12 рджреЗрдЦреЗрдВ , рдЬреЛ рдЖрдкрдХреЛ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд int * int * рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡реЗ рд╕рдВрдЧрдд рдкреНрд░рдХрд╛рд░ рди рд╣реЛрдВред
- рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдПрдХ рдпреЛрдЧреНрдп рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрдиреБрд░реВрдк рдПрдХ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдпрд╛ рдмрд┐рдирд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ,
int x = 1; const unsigned int *p = (const unsigned int*)&x; printf("%u\n", *p ); // *p lvalue- const unsigned int, ,
- рдПрдХ рд╕рдордЧреНрд░ рдпрд╛ рд╕рдВрдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИ (рд╕рд╣рд┐рдд, рдкреБрдирд░рд╛рд╡рд░реНрддреА, рдПрдХ рдЙрдк-рдПрдХрддреНрд░ рдпрд╛ рдирд┐рд╣рд┐рдд рд╕рдВрдШ рдХрд╛ рд╕рджрд╕реНрдп), рдпрд╛
struct foo { int x; }; void foobar( struct foo *fp, int *ip );// struct foo - , int , *ip // foo f; foobar( &f, &f.x );
- рдЪрд░рд┐рддреНрд░ рдкреНрд░рдХрд╛рд░ред
int x = 65; char *p = (char *)&x; printf("%c\n", *p ); // * p lvalue- char, . // - .
рдХреНрдпрд╛ рд╕реА ++ 17 рдбреНрд░рд╛рдлреНрдЯ рдорд╛рдирдХ рдХрд╣рддреЗ рд╣реИрдВрдзрд╛рд░рд╛ 11 рдореЗрдВ рд╕реА ++ 17 рдкрд░рд┐рдпреЛрдЬрдирд╛ рдорд╛рдирдХ [basic.lval] рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ: рдпрджрд┐ рдХреЛрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдореВрд▓реНрдп рдХреЛ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд╕реНрддреБ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ: 63 (11.1) рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рд╣реИ,
void *p = malloc( sizeof(int) ); // , int *ip = new (p) int{0}; // placement new int std::cout << *ip << "\n"; // * ip glvalue- int,
(резрез.реи) - cv-qual (cv - const рдФрд░ рд╡рд╛рд╖реНрдкрд╢реАрд▓) рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг,
int x = 1; const int *cip = &x; std::cout << *cip << "\n"; // * cip glvalue const int, cv- x
(резрез.рей) - рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рди (рдЬреИрд╕рд╛ рдХрд┐ in.рел рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ),
//
(резрез.рек) - рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рдпрд╛ рдЙрд╕рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ,
// si ui ,
// godbolt (https://godbolt.org/g/KowGXB) , .
signed int foo( signed int &si, unsigned int &ui ) { si = 1; ui = 2; return si; }
(резрез.рел) - рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдПрдХ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдпрд╛ рдмрд┐рдирд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ cv- рдпреЛрдЧреНрдп рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддрд╛ рд╣реИ,
signed int foo( const signed int &si1, int &si2); // ,
(резрез.рем) - рдПрдХ рд╕рдордЧреНрд░ рдпрд╛ рд╕рдВрдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХреЗ рддрддреНрд╡реЛрдВ рдпрд╛ рдЧреИрд░-рд╕реНрдереИрддрд┐рдХ рдбреЗрдЯрд╛ рддрддреНрд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИ (рд╕рд╣рд┐рдд, рдкреБрдирд░рд╛рд╡рд░реНрддреА, рдПрдХ рддрддреНрд╡ рдпрд╛ рдЧреИрд░-рд╕реНрдереИрддрд┐рдХ рдбреЗрдЯрд╛ рддрддреНрд╡ рдПрдХ рдЙрдк-рдХреБрд▓ рдпрд╛ рд╕рдВрдШреЛрдВ рд╕реЗ рдпреБрдХреНрдд),
struct foo { int x; };
// Compiler Explorer (https://godbolt.org/g/z2wJTC)
int foobar( foo &fp, int &ip ) { fp.x = 1; ip = 2; return fp.x; } foo f; foobar( f, fx );
(резрез. () - рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдкреНрд░рдХрд╛рд░ (рд╕рдВрднрд╡рддрдГ cv- рдпреЛрдЧреНрдп) рд╣реИ,
struct foo { int x ; }; struct bar : public foo {}; int foobar( foo &f, bar &b ) { fx = 1; bx = 2; return fx; }
(11.8) - char, unsigned char рдпрд╛ std :: byte рдЯрд╛рдЗрдк рдХрд░реЗрдВред
int foo( std::byte &b, uint32_t &ui ) { b = static_cast<std::byte>('a'); ui = 0xFFFFFFFF; return std::to_integer<int>( b ); // b glvalue- std::byte, uint32_t }
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐
signed char
рдЙрдкрд░реЛрдХреНрдд рд╕реВрдЪреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕реА рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдЕрдВрддрд░ рд╣реИ, рдЬреЛ рдЪрд░рд┐рддреНрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЛрд▓рддрд╛ рд╣реИред
рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реА рдФрд░ рд╕реА ++ рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕реА рддрд░рд╣ рдХреА рдмрд╛рддреЗрдВ рдХрд╣рддреЗ рд╣реИрдВ, рдХреБрдЫ рдЕрдВрддрд░ рд╣реИрдВ рдЬрд┐рдирд╕реЗ рд╣рдореЗрдВ рдЕрд╡рдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред C ++ рдореЗрдВ рдПрдХ
рдорд╛рдиреНрдп рдпрд╛
рд╕рдВрдЧрдд рдкреНрд░рдХрд╛рд░ рдХреА C рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ C рдореЗрдВ рдПрдХ
рдЧрддрд┐рд╢реАрд▓ рдпрд╛ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреА C ++ рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рджреЛрдиреЛрдВ рдореЗрдВ рд▓рд╡рд▓реНрдпреВ рдФрд░ рд░рд┐рд╡реЗрд▓реНрдпреВ рднрд╛рд╡ рд╣реИрдВ, рд▓реЗрдХрд┐рди C ++ рдореЗрдВ рдЧреНрд▓рд╡реНрдпреВ, рдкреНрд░реАрд▓реНрдпреВ, рдФрд░ рдЬрд╝рд╡рд▓реНрдпреВ рднрд╛рд╡ рднреА рд╣реИрдВред рдпреЗ рдЕрдВрддрд░ рдХрд╛рдлреА рд╣рдж рддрдХ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореИрд▓реЛрдбреЛрдХ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдореЗрдореЛрд░реА рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рд╕реА рдореЗрдВ, рд╣рдо рдПрдХ рд╡реИрдз рдкреНрд░рдХрд╛рд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реИрд╡рд▓реНрдпреВ рдпрд╛ рдореЗрдорд╕реАрдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦрдирд╛ред
// C, C ++ void *p = malloc(sizeof(float)); float f = 1.0f; memcpy( p, &f, sizeof(float)); // *p - float C // float *fp = p; *fp = 1.0f; // *p - float C
рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рддрд░реАрдХрд╛ C ++ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдирдП рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
float *fp = new (p) float{1.0f} ; // *p float
рдХреНрдпрд╛ int8_t рдФрд░ uint8_t char рдкреНрд░рдХрд╛рд░ рд╣реИрдВ?рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рди рддреЛ int8_t рдФрд░ рди рд╣реА uint8_t рдХреЛ рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╡реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд░рд┐рддреНрд░ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рддреЛ рд╡реЗ рднреА рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдо рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рд╕реЗ
рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдЖ рд╕рдХрддреА рд╣реИ ред рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐
glibc typedef
рдХреНрд░рдорд╢:
signed char
рдФрд░
unsigned char
рд▓рд┐рдП
int8_t
рдФрд░
uint8_t
рд╣реИред
рдЗрд╕реЗ рдмрджрд▓рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ C ++ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ ABI рдЧреИрдк рд╣реЛрдЧрд╛ред рдпрд╣ рдирд╛рдо рд╡рд┐рд░реВрдкрдг рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ рдФрд░ рдХрд┐рд╕реА рднреА рдПрдкреАрдЖрдИ рдХреЛ рдЙрдирдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреЛрдбрд╝ рджреЗрдЧрд╛ред
рдкрд╣рд▓реЗ рднрд╛рдЧ рдХрд╛ рдЕрдВрддред рдФрд░ рд╣рдо рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдФрд░ рдЕрд▓рд╛рдЗрдирдореЗрдВрдЯ рдХреА рд╕рдЬрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВ рдФрд░
рдЦреБрд▓реЗ рд╡реЗрдмрд┐рдирд╛рд░ рдХреЛ рдпрд╛рдж рди рдХрд░реЗрдВ, рдЬреЛ 6 рдорд╛рд░реНрдЪ рдХреЛ
рд░рд╛рдордмрд▓рд░ рдПрдВрдб рдХрдВрдкрдиреА,
рджрд┐рдорд┐рддреНрд░реА рд╢рдмреЙрд░реНрдбреЗрд╡ рдореЗрдВ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рд╡рд┐рдХрд╛рд╕ рдХреЗ рдкреНрд░рдореБрдЦ рджреНрд╡рд╛рд░рд╛ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред