рдЕрдВрдд рдореЗрдВ, рдореИрдВрдиреЗ [[trivial_abi]] рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦреА!
рдпрд╣ рдХреНрд▓реИрдВрдЧ рдЯреНрд░рдВрдХ рдореЗрдВ рдПрдХ рдирдИ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдлрд░рд╡рд░реА 2018 рддрдХ рдирдпрд╛ рд╣реИред рдпрд╣ рд╕реА ++ рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рд╡рд┐рдХреНрд░реЗрддрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ, рдпрд╣ рдорд╛рдирдХ рд╕реА ++ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЬреАрд╕реАрд╕реА рдЯреНрд░рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕реАрдЬреА рдорд╛рдирдХ рдореЗрдВ рдЗрд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрдмреНрд▓реНрдпреВрдЬреА 21 рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдХреНрд░рд┐рдп рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рд╣реИрдВ, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рднрд╛рдЧ рдирд╣реАрдВ рд▓рд┐рдпрд╛ред рдореИрдВ рдмрд╕ cfe-commits рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдкрд░ рдкреИрдЪ рдХреЛ рджреЗрдЦрд╛ рдФрд░ рдЦреБрдж рдХреЛ рдЪреБрдкрдЪрд╛рдк рд╕рд░рд╛рд╣рдирд╛ рдХреАред рд▓реЗрдХрд┐рди рдпрд╣ рдЗрддрдиреА рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдо рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ: рдпрд╣ рдПрдХ рдорд╛рдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХреНрд▓реИрдВрдЧ рдЯреНрд░рдВрдХ рдЗрд╕рдХреЗ рд▓рд┐рдП [[trivial_abi]] рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдорд╛рдирдХ рд╡рд░реНрддрдиреА рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ рдЗрд╕реЗ рдкреБрд░рд╛рдиреА рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
__attribute__((trivial_abi)) __attribute__((__trivial_abi__)) [[clang::trivial_abi]]
рдФрд░, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рд╕рдВрдХрд▓рдХ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЪреБрд╕реНрдд рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХрд╣рд╛рдБ рдкреЗрд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЧрд▓рдд рдЬрдЧрд╣ рдкрд░ рдкреЗрд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЖрдХреНрд░рд╛рдордХ рддрд░реАрдХреЗ рд╕реЗ рдЪреБрдк рд░рд╣реЗрдВ (рдХреНрдпреЛрдВрдХрд┐ рдЕрдкрд░рд┐рдЪрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдпрд╣ рдПрдХ рдмрдЧ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рд╕рд╣реА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдпрд╣ рд╣реИ:
#define TRIVIAL_ABI __attribute__((trivial_abi)) class TRIVIAL_ABI Widget {
рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛрддреА рд╣реИ?
04/17/2018 рдХреЛ рдореЗрд░реА рдкреЛрд╕реНрдЯ рдпрд╛рдж рд░рдЦреЗрдВ рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдХрдХреНрд╖рд╛ рдХреЗ рджреЛ рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдП рдереЗ?
рд▓рдЧрднрдЧред perev: рдЪреВрдБрдХрд┐ режрек/резv/реирежрез a рдХреЗ рдкреЛрд╕реНрдЯ рдХреА рдорд╛рддреНрд░рд╛ рдереЛрдбрд╝реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрд▓рдЧ рд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдпрд╣реАрдВ рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдиреАрдЪреЗ рдбрд╛рд▓ рджрд┐рдпрд╛ред
04/17/2018 рд╕реЗ рдкреЛрд╕реНрдЯрдЧреБрдо рддреБрдЪреНрдЫ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЙрд▓ рдХрд╛ рдиреБрдХрд╕рд╛рди
C ++ рдорд╛рдирдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рджреЗрдЦреЗрдВред рджреЛ рдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рдлрд╝рдВрдХреНрд╢рди, рдлреВ рдпрд╛ рдмрд╛рд░, рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХреЛрдб рд╣реЛрдЧрд╛?
struct Integer { int value; ~Integer() {}
рдЬреАрд╕реАрд╕реА рдФрд░ libstdc ++ рдХреЗ рд╕рд╛рде
рд╕рдВрдХрд▓рди ред рд╕рд╣реА рд▓рдЧрддрд╛ рд╣реИ?
foo: movq 8(%rdi), %rax imull $-559038737, -4(%rax), %edx subq $4, %rax movl %edx, (%rax) movq %rax, 8(%rdi) ret bar: subq $4, 8(%rdi) ret
рдпрд╣рд╛рдВ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ: рдЬреАрд╕реАрд╕реА рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдЬрдм рдПрдХ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкрд┐рдЫрд▓реА рд╕рднреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ "рдореГрдд" рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬреАрд╕реАрд╕реА рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕реНрдорд╛рд░реНрдЯ рд╣реИ рдХрд┐ рдПрдХ рддреБрдЪреНрдЫ рд╡рд┐рдзреНрд╡рдВрд╕рдХ (рдЬреИрд╕реЗ рдХрд┐ рдЫрджреНрдо рд╡рд┐рдзреНрд╡рдВрд╕рдХ ~ int ()) рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдкреИрджрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рддреЛ, рдмрд╛рд░ рдлрд╝рдВрдХреНрд╢рди pop_back рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ ~ Integer () рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЬреЛ vec.back () рдХреЛ рдореГрдд рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ GCC 0xDEADBEEF рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред
рджреВрд╕рд░реА рдУрд░, foo pop_back рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЫрджреНрдо рд╡рд┐рдзреНрд╡рдВрд╕рдХ ~ int () рдХреЛ рдЪрд▓рд╛рддрд╛ рд╣реИ (рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЙрд▓ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ), GCC рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЦрд╛рд▓реА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬреАрд╕реАрд╕реА рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдЯрдмреИрдХ () рдореГрдд рд╣реИ, рдФрд░ 0xDEADBEEF рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рддрд╛ рд╣реИред
рдпрд╣ рдПрдХ рддреБрдЪреНрдЫ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЫрджреНрдо рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЬреИрд╕реЗ ~ int ()ред рд╣рдорд╛рд░реЗ ~ рдкреВрд░реНрдгрд╛рдВрдХ () {} рдХреЛ ~ рдкреВрд░реНрдгрд╛рдВрдХ () = рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ; рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛!
struct Foo { int value; ~Foo() = default;
рдЙрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдлреВ рдХреЗ рд▓рд┐рдП рдмрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЦрд░рд╛рдм рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдХреНрдпреЛрдВ рдерд╛ред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕рд╣рдЬрддрд╛ рд╕реЗ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ "рдЯреНрд░рд┐рд╡рд┐рдпрд▓" рдХреЛрдб "рдиреИрдЯрд┐рд╡рд┐рдпрд▓" рдХреЛрдб рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рдЬреНрдпрд╛рджрд╛рддрд░ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдпрд╣реА рд╣реЛрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрдм рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВ:
template<class T> T incr(T obj) { obj.value += 1; return obj; }
incr рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛
рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реИ:
leal 1(%rdi), %eax retq
(leal x86
рдХрдорд╛рдВрдб рдХрд╛ рдЕрд░реНрде рд╣реИ "рдПрдбред") рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА 4-рдмрд╛рдЗрдЯ obj рдХреЛ% edi рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ incr рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдореЗрдВ 1 рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ% ex рдкрд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдЗрдирдкреБрдЯ рдкрд░ рдЪрд╛рд░ рдмрд╛рдЗрдЯ, рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдЪрд╛рд░ рдмрд╛рдЗрдЯ, рдЖрд╕рд╛рди рдФрд░ рд╕рд░рд▓ред
рдЕрдм рдЖрдЗрдП incr (рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рд╕рд╛рде рдорд╛рдорд▓рд╛) рдХреЛ рджреЗрдЦреЗрдВред
movl (%rsi), %eax addl $1, %eax movl %eax, (%rsi) movl %eax, (%rdi) movq %rdi, %rax retq
рдпрд╣рд╛рдБ, рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ obj рдкрд╛рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдпрд╣рд╛рдБ рдПрдХ рд╣реА рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде 4 рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВред рдпрд╣рд╛рдБ obj рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкрддреЗ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИред рдпрд╣рд╛рдВ рдХреЙрд▓рд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрдерд╛рди рд░рдЦрддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЗрд╕ рдЬрдЧрд╣ рдХреЛ рдЖрд░рдбреА рдореЗрдВ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣рдореЗрдВ рддрд░реНрдХ% rsi рдХреЗ рдЕрдЧрд▓реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ obj рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рджреЗрддрд╛ рд╣реИред рд╣рдо рдорд╛рди (% rsi) рд╕реЗ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, 1 рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╡рд╛рдкрд╕ (% rsi) рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдУрдмреНрдЬ рдХреЗ рдорд╛рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдлрд┐рд░ (trivially) 4% рдмрд╛рдЗрдЯреНрд╕ obj рдХреЛ рд╕реНрд▓реЙрдЯ рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП% rdi рдХреЗ рд▓рд┐рдП рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЕрдВрдд рдореЗрдВ, рд╣рдо рдХреЙрд▓рд░ рдХреЛ% rdi рд╕реЗ% rax рддрдХ рдкрд╛рд░рд┐рдд рдореВрд▓ рд╕реВрдЪрдХ рдХреЛ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐
x86-64 ABI рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ (рдкреГрд╖реНрда 22) рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред
рдХрд╛рд░рдг рдмрд╛рд░ рдлреВ рд╕реЗ рдЗрддрдирд╛ рдЕрд▓рдЧ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рд░ рдореЗрдВ рдПрдХ nontrivial рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╣реИ, рдФрд░
x86-64I (рдкреГрд╖реНрда 19) рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ:
рдпрджрд┐ C ++ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ nontrivial рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдпрд╛ рдПрдХ nontrivial рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ, рддреЛ рдЗрд╕реЗ рдПрдХ рдЕрджреГрд╢реНрдп рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдкреИрд░рд╛рдореАрдЯрд░ рд╕реВрдЪреА рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреЙрдЗрдВрдЯрд░ [...] рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)
рдмрд╛рдж рдореЗрдВ
Itanium C ++ ABI рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:
рдпрджрд┐ рдХреЙрд▓ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ nontrivial рд╣реИ, рддреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕реНрдерд╛рди рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕ рдЕрд╕реНрдерд╛рдпреА рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
[...]
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреЙрд▓ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП nontrivial рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдЗрд╕рдореЗрдВ рдПрдХ nontrivial рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рдПрдХ рдореВрд╡рд┐рдВрдЧ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рдПрдХ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░, рдпрд╛ рдЗрд╕рдХреЗ рд╕рднреА рдореВрд╡рд┐рдВрдЧ рдФрд░ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рддреЛ рдпрд╣ рд╕рдм рдХреБрдЫ рд╕рдордЭрд╛рддрд╛ рд╣реИ: рдмрд╛рд░ рдХреА рдЧрд░реАрдм рдХреЛрдб рдкреАрдврд╝реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрджреГрд╢реНрдп рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЕрджреГрд╢реНрдп рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рджреЛ рд╕реНрд╡рддрдВрддреНрд░ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдЕрд╢реБрдн рд╕рдВрдпреЛрдЬрди рд╣реЛрддрд╛ рд╣реИ:
- ABI рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЧреИрд░-рддреБрдЪреНрдЫ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрджреГрд╢реНрдп рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
- рдмрд╛рд░ рдореЗрдВ рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╣реИред
рдпрд╣ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ
рд╕рд┐рд▓реНрд▓реЛрдЧрд┐рдЬреНрдо рд╣реИ : рдкрд╣рд▓рд╛ рдмрд┐рдВрджреБ рдореБрдЦреНрдп рдЖрдзрд╛рд░ рд╣реИ, рджреВрд╕рд░рд╛ рдирд┐рдЬреА рд╣реИред рдирддреАрдЬрддрди, рдмрд╛рд░ рдПрдХ рдЕрджреГрд╢реНрдп рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдХреЛрдИ рд╣рдореЗрдВ рдПрдХ рдирдкреБрдВрд╕рдХрддрд╛ рджреЗ:
- рд╕рднреА рд▓реЛрдЧ рдирд╢реНрд╡рд░ рд╣реИрдВ
- рд╕реБрдХрд░рд╛рдд рдПрдХ рдЖрджрдореА рд╣реИред
- рдирддреАрдЬрддрди, рд╕реБрдХрд░рд╛рдд рдирд╢реНрд╡рд░ рд╣реИред
рдпрджрд┐ рд╣рдо рдирд┐рд╖реНрдХрд░реНрд╖ рдХрд╛ рдЦрдВрдбрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ "рд╕реБрдХрд░рд╛рдд рдирд╢реНрд╡рд░ рд╣реИ," рд╣рдореЗрдВ рдкрд░рд┐рд╕рд░ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЦрдВрдбрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: рдпрд╛ рддреЛ рдореБрдЦреНрдп рдмрд╛рдд (рд╢рд╛рдпрдж рдХреБрдЫ рд▓реЛрдЧ рдирд╢реНрд╡рд░ рдирд╣реАрдВ рд╣реИрдВ) рдХрд╛ рдЦрдВрдбрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдирд┐рдЬреА рдХрд╛ рдЦрдВрдбрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рд╢рд╛рдпрдж рд╕реБрдХрд░рд╛рдд рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИ)ред
рдмрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ (рдлреВ рдХреА рддрд░рд╣) рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рджреЛ рдкрд░рд┐рд╕рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЦрдВрдбрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╛рдирдХ C ++ рдкрде рдирд┐рдЬреА рдЖрдзрд╛рд░ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд░ рдХреЛ рдПрдХ рддреБрдЪреНрдЫ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ!
рдХреИрд╕реЗ [[trivial_abi]] рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ
рдирдИ рдХреНрд▓реИрдВрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореБрдЦреНрдп рдЖрдзрд╛рд░ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддреА рд╣реИред рдХреНрд▓реИрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ ABI рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░:
рдпрджрд┐ рдХреЙрд▓ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ nontrivial рд╣реИ, рддреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕реНрдерд╛рди рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕ рдЕрд╕реНрдерд╛рдпреА рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
[...]
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреЙрд▓ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ nontrivial рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕реЗ [[trivial_abi]] рдФрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдЗрд╕рдореЗрдВ рдПрдХ nontrivial рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рдПрдХ рдореВрд╡рд┐рдВрдЧ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рдПрдХ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░, рдпрд╛ рдЗрд╕рдХреЗ рд╕рднреА рдореВрд╡рд┐рдВрдЧ рдФрд░ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдПрдХ nontrivial рдореВрд╡рд┐рдВрдЧ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдпрд╛ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдХреЙрд▓ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рддреБрдЪреНрдЫ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рдЗрд╕реЗ [[trivial_abi] рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рддреЛ рдЕрдм, Clang рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
#define TRIVIAL_ABI __attribute__((trivial_abi)) struct TRIVIAL_ABI Baz { int value; ~Baz() {}
рд╕рдВрдХрд▓рди <br>, рдФрд░ incr <Foo> рдХреЗ рд╕рдорд╛рди рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ!
рдЪреЗрддрд╛рд╡рдиреА # 1: [[trivial_abi]] рдХрднреА-рдХрднреА рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдо рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ "рдХреЙрд▓рд┐рдВрдЧ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рддреБрдЪреНрдЫ" рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:
template<class T, class D> struct TRIVIAL_ABI trivial_unique_ptr : std::unique_ptr<T, D> { using std::unique_ptr<T, D>::unique_ptr; };
рдХрд╛рд╢, рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ред рдпрджрд┐ рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдореЗрдВ рдХреЛрдИ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдпрд╛ рдЧреИрд░-рд╕реНрдерд┐рд░ рдлрд╝реАрд▓реНрдб рд╣реИрдВ, рдЬреЛ "рдХреЙрд▓ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП nontrivial" рд╣реИрдВ, рддреЛ рдХреНрд▓реИрдВрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдЙрд╕ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдм рдЖрдкрдХреА рдХрдХреНрд╖рд╛ "рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд░реВрдк рд╕реЗ", рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝реЗрдЧрд╛ред (рдХреЛрдИ рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрд╕рдВрджреЗрд╢ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд▓рд╛рд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ [[trivial_abi]] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХрдХреНрд╖рд╛ "рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рддреБрдЪреНрдЫ" рд╣реЛрдЧреА, рдЬреЛ рдХрднреА-рдХрднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрддреА рд╣реИред рдиреБрдХрд╕рд╛рди, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд░реНрдЧ рдХреЛ рддреБрдЪреНрдЫ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдкрд╛рдПрдВ рдХрд┐ рд╕рдВрдХрд▓рдХ рдиреЗ рдЪреБрдкрдЪрд╛рдк рдЗрд╕реЗ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рд╣реИред)
рдпрджрд┐ рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдмреЗрд╕ рдХреНрд▓рд╛рд╕, рдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реИрдВ, рддреЛ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рд╢рд╛рдпрдж рдЬрд╛рдирддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, "рдорд╛рдирдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╡рд╛рджреА рдкреНрд░рдХрд╛рд░" рдХреЗ рд▓рд┐рдП TRIVIAL_ABI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ <T>, unique_ptr <T> рдФрд░ рд╕рд╛рдЭрд╛_ptr <T> рд╣реИред
- рдЙрдиреНрд╣реЗрдВ рдЦрд░реЛрдВрдЪ рд╕реЗ рдЦреБрдж рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдпрд╛
- libc ++ рдХреА рдЕрдкрдиреА рд╕реНрдерд╛рдиреАрдп рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдореЗрдВ рд╡рд┐рд░рд╛рдо рдХрд░реЗрдВ рдФрд░ рд╡рд╣рд╛рдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдбрд╛рд▓реЗрдВ
(рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ, рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╣реИрдВ)
рдЪреЗрддрд╛рд╡рдиреА # 2: рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдЬрд┐рдореНрдореЗрджрд╛рд░реА
рдлреВ / рдмрд╛рд░ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╣реИред рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдирд┐рд░рд░реНрдердХ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд╣реЛрдиреЗ рджреЛред
struct Up1 { int value; Up1(Up1&& u) : value(u.value) { u.value = 0; } ~Up1() { puts("destroyed"); } };
рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ_рдкреНрд░рддрд┐ <int> рд╣реИ, рд╕реАрдорд╛ рддрдХ рд╕рд░рд▓реАрдХреГрдд, рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдкрд░ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рдеред
TRIVIAL_ABI рдХреЗ рдмрд┐рдирд╛, incr <Up1> рдмрд╕ incr <Bar> рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
movl (%rsi), %eax addl $1, %eax movl %eax, (%rdi) movl $0, (%rsi) movq %rdi, %rax retq
TRIVIAL_ABI рдХреЗ рд╕рд╛рде, incr
рдмрдбрд╝рд╛ рдФрд░ рдбрд░рд╛рд╡рдирд╛ рд▓рдЧрддрд╛
рд╣реИ !
pushq %rbx leal 1(%rdi), %ebx movl $.L.str, %edi callq puts movl %ebx, %eax popq %rbx retq
рдкрд╛рд░рдВрдкрд░рд┐рдХ рдХреЙрд▓рд┐рдВрдЧ рдХрдиреНрд╡реЗрдВрд╢рди рдореЗрдВ, рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╣рдореЗрд╢рд╛ рдПрдХ рдЕрджреГрд╢реНрдп рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░рд╛рдкреНрдд рдкрдХреНрд╖ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ incr) рд╣рдореЗрд╢рд╛ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рд▓рд┐рдХ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдкрд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╣реЛрддрд╛ рд╣реИред
рдЬрдм рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ [[trivial_abi]] рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рддреЗ рд╣реИрдВред
рдЪреВрдБрдХрд┐ x86-64 рдХреЗ рдкрд╛рд╕ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИ (рддрд╛рд▓рд┐рдпрд╛рдБ), рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╛рд╕ рдЕрдВрдд рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рддрдерд╛рдХрдерд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрд╕ рд╡рд╕реНрддреБ рдХрд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдерд╛! рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд┐рдирд╛рд╢рдХрд░реНрддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рд╣рдорд╛рд░реЗ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдлреВ / рдмрд╛рд░ / рдмрд╛рдЬ, рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЦрд╛рд▓реА рдерд╛, рдФрд░ рд╣рдордиреЗ рдЗрд╕реЗ рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЕрдм incr <Up2> рдореЗрдВ рд╣рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдлрдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреА рдХреЙрд▓ рдХрд╣реАрдВ рднреА рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ! рдЗрд╕реЗ incr рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ
рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореВрд▓реНрдп рдФрд░ рд▓рд╛рдн рд╕рдВрддреБрд▓рд┐рдд рд╣реЛрдВрдЧреЗред
рдЪреЗрддрд╛рд╡рдиреА # 3: рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдЖрджреЗрд╢
рдПрдХ рддреБрдЪреНрдЫ рдПрдмреАрдЖрдИ рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдХреЙрд▓рд┐рдВрдЧ рдПрдХ (рдЪреЗрддрд╛рд╡рдиреА рдирдВрдмрд░ 2) рдирд╣реАрдВред рд░рд┐рдЪрд░реНрдб рд╕реНрдорд┐рде рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЙрд╕реЗ рдЙрд╕ рдХреНрд░рдо рдореЗрдВ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╕реНрдерд┐рдд рд╣реИрдВред
struct TRIVIAL_ABI alpha { alpha() { puts("alpha constructed"); } ~alpha() { puts("alpha destroyed"); } }; struct beta { beta() { puts("beta constructed"); } ~beta() { puts("beta destroyed"); } }; void foo(alpha, beta) {} int main() { foo(alpha{}, beta{}); }
рдпрд╣ рдХреЛрдб рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ:
alpha constructed beta constructed alpha destroyed beta destroyed
рдЬрдм TRIVIAL_ABI рдХреЛ [[clang :: trivial_abi]] рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ:
alpha constructed beta constructed beta destroyed alpha destroyed
"рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп" / "рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд-рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд" рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдз
рдХреЛрдИ рд░рд┐рд╢реНрддрд╛ рдирд╣реАрдВ ..., рд╣реБрд╣?
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЪрд▓рддреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░, рдпрд╛ рдбрд┐рдлреЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд▓рд┐рдП [[trivial_abi]] рд╡рд░реНрдЧ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдХреЛрдИ рднреА рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рд╕рдВрднрд╡рддрдГ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рд╣реЛрдЧрд╛, рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд░реНрдЧ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рд╣реИрдВред
рд╣рдо рдХреЗрд╡рд▓ рдСрдлрд╕реЗрдЯ_рдкреНрдЯреНрд░ рд╡рд░реНрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рди рд╣реЛ:
template<class T> class TRIVIAL_ABI offset_ptr { intptr_t value_; public: offset_ptr(T *p) : value_((const char*)p - (const char*)this) {} offset_ptr(const offset_ptr& rhs) : value_((const char*)rhs.get() - (const char*)this) {} T *get() const { return (T *)((const char *)this + value_); } offset_ptr& operator=(const offset_ptr& rhs) { value_ = ((const char*)rhs.get() - (const char*)this); return *this; } offset_ptr& operator+=(int diff) { value_ += (diff * sizeof (T)); return *this; } }; int main() { offset_ptr<int> top = &a[4]; top = incr(top); assert(top.get() == &a[5]); }
рдпрд╣рд╛рдБ рдкреВрд░рд╛ рдХреЛрдб рд╣реИредрдЬрдм TRIVIAL_ABI рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреНрд▓реИрдВрдЧ рдЯреНрд░рдВрдХ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ -O0 рдФрд░ -O1 рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди -O2 (рдпрд╛рдиреА рдЬреИрд╕реЗ рд╣реА рдпрд╣ рдЗрдирд▓рд╛рдЗрди рдХреЙрд▓ рдХреЛ trivial_offset_ptr - рдСрдкрд░реЗрдЯрд░ + = рдФрд░ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ), рдпрд╣ рдореБрдЦрд░ рдкрд░ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рддреЛ рдПрдХ рдФрд░ рдЪреЗрддрд╛рд╡рдиреАред рдпрджрд┐ рдЖрдкрдХрд╛ рдкреНрд░рдХрд╛рд░ рдЗрд╕ рд╕реВрдЪрдХ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкрд╛рдЧрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕рдВрднрд╡рддрдГ рдЗрд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
рдмрдЧ 37319 , рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдзред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдХреЛрдб рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ value_ рдХрд╛ рдорд╛рди рдЗрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдорд╛рди рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХреЙрд▓рд┐рдВрдЧ рдФрд░ рддрдерд╛рдХрдерд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмреАрдЪ рдХреА рд╕реАрдорд╛ рдкрд░, рдСрдмреНрдЬреЗрдХреНрдЯ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ! рдЗрд╕рд▓рд┐рдП, рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕реЗ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреИрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реИрд▓реНрдпреВ_ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рд╣реА рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП? рд╢рд╛рдпрдж рдпрд╣ рдкреВрдЫрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ -O0?
рдпрд╣ рдХреЛрдб рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПредрдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк [[trivial_abi]] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ (рди рдХреЗрд╡рд▓ рд╡рд┐рд╢реЗрд╖, рдмрд▓реНрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ) рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрддреЗ ("рдЖрд╡рд╢реНрдпрдХ" рд╢рдмреНрдж рдХреЗ рдХреБрдЫ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрд░реНрде рдкрд░) рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред
рд╕рд╣рдЬ рд░реВрдк рд╕реЗ, рдЬрдм рдПрдХ рд╡рд░реНрдЧ рдХреЛ [[trivial_abi]] рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рднреА рдЖрдк рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреЙрдкреА рдкреНрд▓рд╕ рдореЗрдорд╕реАрдкреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕реА рддрд░рд╣, рдЬрдм рдЖрдк рдПрдХ рдЪрд╛рд▓ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд▓ рдкреНрд▓рд╕ рдореЗрдореНрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЬрдм рдПрдХ рдкреНрд░рдХрд╛рд░ "рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп" рд╣реЛрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛
C ++ Now рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛
рд╣реИ ), рддреЛ рдХрднреА рднреА рдЖрдк рдирдХрд▓ рдФрд░ рд╡рд┐рдирд╛рд╢ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╛рджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕реА рддрд░рд╣, рдЬрдм рдЖрдк рд╡рд┐рд╕реНрдерд╛рдкрди рдФрд░ рд╡рд┐рдирд╛рд╢ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╛рджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рд╣рдо "рддреБрдЪреНрдЫ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдЦреЛ рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬрдм рдХрдХреНрд╖рд╛ рдореЗрдВ [[trivial_abi]] рдХреНрд▓реИрдВрдЧ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдХреЙрд▓ рдЧреБрдо рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВред рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЙрди рдХреЙрд▓ рдХреЗ рдЕрд▓рд╛рд╡рд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдерд╛) рдпрд╛рджрдЧрд╛рд░ рдереАред рдпрд╣ (рд╕реЙрд░реНрдЯ) рдореЗрдорд╕реАрдкреА рд╡рд╣ рдореВрд▓реНрдп рд╣реИ рдЬреЛ рдЖрдк рддреЗрдЬреА рд╕реЗ, рдХреЙрд▓ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕рдореНрдореЗрд▓рди рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рддреЗ рд╣реИрдВред
рдЖрдЧреЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ:
рдирд╡рдВрдмрд░ 2017 рд╕реЗ рдЕрдХреАрд░рд╛ рд╣рддрдирдирд╛рдХрд╛ рдХрд╛ рд╕реАрдлрд╝-рджреЗрд╡ рдзрд╛рдЧрд╛рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдХреНрд▓реИрдВрдЧ рдкреНрд░рд▓реЗрдЦрдирдЗрдХрд╛рдИ trivial_abi рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд░рддреА рд╣реИрдмрдЧ 37319: trivial_offset_ptr рд╕рдВрднрд╡рддрдГ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛