рдореИрдВ рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХрд╛ рд╕рдореНрдорд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╛ рдирд┐рдЬреА рддрд░реАрдХреЛрдВ рдХреЗ рддреЗрдЬреА рд╕реЗ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ

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



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

рдЖрдорддреМрд░ рдкрд░, рдпрджрд┐ рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЗ 2 рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗ, рдпрд╛рдиреА рд╡реЗ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛрдВрдЧреЗ (рдУрд╡рд░рд▓реИрдк рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕реНрдЯреНрд░рдХреНрдЪрд░рд▓рд╛рдЗрдЙрдЯ рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЦреЗрддреЛрдВ рдХрд╛ рд╕реНрдерд╛рди рдкрд░реНрдпрд╛рд╡рд░рдг рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдлрд╝реАрд▓реНрдб рдХреА рдСрдлрд╝рд╕реЗрдЯреНрд╕ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ LayoutKind.Explicit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред рдирд┐рдореНрди рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ:

public class CustomClass { public override string ToString() { return "CUSTOM"; } public virtual object Field { get; } = new object(); } 

рдЕрдЧрд▓рд╛, рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреНрд╖реЗрддреНрд░ рдСрдлрд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реНрдпреБрдХреНрдд рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

  [StructLayout(LayoutKind.Explicit)] public class CustomStructWithLayout { [FieldOffset(0)] public string Str; [FieldOffset(0)] public CustomClass SomeInstance; } 

рдЕрднреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгреЛрдВ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░реВрдБрдЧрд╛ рдФрд░ рд▓рд┐рдЦрд┐рдд рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд░реВрдВрдЧрд╛:

  class Program { static void Main(string[] args) { CustomStructWithLayout instance = new CustomStructWithLayout(); instance.SomeInstance = new CustomClass(); instance.Str = "4564"; Console.WriteLine(instance.SomeInstance.GetType()); //System.String Console.WriteLine(instance.SomeInstance.ToString()); //4564 Console.Read(); } } 

рдЧреЗрдЯрдЯрд╛рдЗрдк () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЗрддрд╛ рд╣реИ, ToString () рд╡рд┐рдзрд┐ рд╢рд░рд╛рд░рддреА рд╣реИ рдФрд░ рд╣рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ "4564" рджреЗрддреА рд╣реИред

рдмреНрд░реЗрди рдбрд┐рд╕реНрдЪрд╛рд░реНрдЬ: рдХрд╕реНрдЯрдордХреНрд▓рд╛рд╕ рд╡рд░реНрдЪреБрдЕрд▓ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ, рд╣рдордиреЗ CustomStructWithLayout рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рд╣реИ , рджреЛрдиреЛрдВ рд▓рд┐рдВрдХ рдЕрд╢рдХреНрдд рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ Str рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред рдирддреАрдЬрддрди, CustomClass рд▓рд┐рдВрдХ CustomClass рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ System.string рдСрдмреНрдЬреЗрдХреНрдЯ (рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдЗрдХрд╛рдИ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╕рд╣рд┐рдд) рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдХреНрд╖реЗрддреНрд░ рдЕрднреА рднреА рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред

рдкреНрд░рдорд╛рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ WinDbg рд╕реЗ рдПрдХ рдЫреЛрдЯреА рдХреНрд▓рд┐рдкрд┐рдВрдЧ рджреА рдЧрдИ рд╣реИ:



рдпрд╣рд╛рдВ рдЖрдк рдХреБрдЫ рдЕрд╕рд╛рдорд╛рдиреНрдп рдЪреАрдЬреЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

  • CustomStructWithLayout рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдореЗрдердбрдЯреЗрдмрд▓реНрд╕ (рдЕрддреНрдпрдзрд┐рдХ рдЕрдкреЗрдХреНрд╖рд┐рдд) рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрддреЗ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкрддреЗ рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВред
  • рджреВрд╕рд░рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рджреЛрдиреЛрдВ рдХреНрд╖реЗрддреНрд░ рдСрдлрд╕реЗрдЯ 4 рдкрд░ рд╕реНрдерд┐рдд рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧ рд╕рдордЭреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛, рд╕реАрдзреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкрддреЗ рдкрд░ рддрд░реАрдХреЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд░рдЦрд╛ред рдлрд╝реАрд▓реНрдб 4 рдмрд╛рдЗрдЯреНрд╕ (32 рдмрд┐рдЯреНрд╕ рдХреЗ рд▓рд┐рдП) рдХреА рдСрдлрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ -4 рдХреЗ рдСрдлрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рдд рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рджреЛрдиреЛрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдПрдХ рд╣реА рдСрдлрд╕реЗрдЯ рдкрд░ рд╣реИрдВред

рдЕрдм рдЬрдм рдЖрдкрдХреЛ рдкрддрд╛ рдЪрд▓ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдлрд╝рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдиреЛрдЯ: рдХреЗрд╡рд▓ рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрд╕реНрдЯреНрд╕ рдФрд░ рд╕реНрдЯреЗрдЯрд┐рдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ

  public class CustomClassLikeString { public const int FakeAlignConst = 3; public const int FakeCharPtrAlignConst = 3; public static readonly object FakeStringEmpty; public char FakeFirstChar; public int FakeLength = 3; public const int FakeTrimBoth = 3; public const int FakeTrimHead = 3; public const int FakeTrimTail = 3; public CustomClassLikeString(){} public CustomClassLikeString(int a){} public CustomClassLikeString(byte a){} public CustomClassLikeString(short a){} public CustomClassLikeString(string a){} public CustomClassLikeString(uint a){} public CustomClassLikeString(ushort a){} public CustomClassLikeString(long a){ } public void Stub1() { } public virtual int CompareTo(object value) { return 800; } public virtual int CompareTo(string value) { return 801; } } 

рдЦреИрд░, рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

  [StructLayout(LayoutKind.Explicit)] public class CustomStructWithLayout { [FieldOffset(0)] public string Str; [FieldOffset(0)] public CustomClassLikeString SomeInstance; } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкрддреЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЗрди рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд╕рдорд╛рди рдСрдлрд╕реЗрдЯ рдХреЗ рдХрд╛рд░рдг рдлреЗрдХрд▓реЗрдВрдЧреНрде рдпрд╛ рдХрдВрдкреЗрд░рд┐рдЯреЛ () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ , рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ)ред

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

рддреЛ, рдкреНрд░рджрд░реНрд╢рдиред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЬрд┐рди рдЪреАрдЬреЛрдВ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рдореЗрдВ рдПрдХ рдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рддрд┐рдпреЛрдЧреА рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рдЪреАрдЬрд╝ рд╕реЗ рддреЗрдЬрд╝ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдЯреАрдХ рдорд╛рди:
рд╡рд┐рдзрд┐рдХрд╛рдордореАрдирддреНрд░реБрдЯрд┐StdDevрдордВрдЭрд▓рд╛
StructLayoutFieldclr0.0597 рдПрди.рдПрд╕.0.0344 рдПрди.рдПрд╕.0.0396 рдПрди.рдПрд╕.0.0498 рдПрди.рдПрд╕.
ReflectionFieldclr197.1257 рдПрди.рдПрд╕.1.9148 рдПрди.рдПрд╕.1.7911 рдПрди.рдПрд╕.197.4787 рдПрди.рдПрд╕.
StructLayoutMethodclr3.5195 рдПрди.рдПрд╕.0.0382 рдПрди.рдПрд╕.0.0319 рдПрди.рдПрд╕.3.5285 рдПрди.рдПрд╕.
ReflectionMethodclr743.9793 рдПрди.рдПрд╕.13.7378 рдПрди.рдПрд╕.12.8504 рдПрди.рдПрд╕.743.8471 рдПрди.рдПрд╕.


рдпрд╣рд╛рдВ рдХреЛрдб рдХрд╛ рдПрдХ рд▓рдВрдмрд╛ рдЯреБрдХрдбрд╝рд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХреИрд╕реЗ рдорд╛рдкрд╛ (рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ):
рдХреЛрдб
  [ClrJob] [RPlotExporter, RankColumn] [InProcessAttribute] public class Benchmarking { private CustomStructWithLayout instance; private string str; [GlobalSetup] public void Setup() { instance = new CustomStructWithLayout(); instance.SomeInstance = new CustomClassLikeString(); instance.Str = "4564"; str = "4564"; } [Benchmark] public int StructLayoutField() { return instance.SomeInstance.FakeLength; } [Benchmark] public int ReflectionField() { return (int)typeof(string).GetField("m_stringLength", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(str); } [Benchmark] public int StructLayoutMethod() { return instance.SomeInstance.CompareTo("4564"); } [Benchmark] public int ReflectionMethod() { return (int)typeof(string).GetMethod("CompareTo", new[] { typeof(string) }).Invoke(str, new[] { "4564" }); } } class Program { static void Main(string[] args) { var summary = BenchmarkRunner.Run<Benchmarking>(); } } 


рд░реВрд╕реА рд╕рдВрд╕реНрдХрд░рдг

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


All Articles