рдЬрд╛рд╡рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ

Habrahabr.ru/blogs/java/134102 рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рддред

рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореБрдЭреЗ JVM рдХреЗ рдЕрдВрджрд░ рдереЛрдбрд╝реА рдЦреБрджрд╛рдИ рдХрд░рдиреА рдкрдбрд╝реАред рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рдЕрдиреБрднрд╡ред рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рд╖рдп рдХрд╛ рдкрд╛рда рдореЗрд░реЗ рдЕрдиреБрднрд╡ рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЦреБрдж рдХреЛ рдкреВрд░реНрдг рд╕рддреНрдп рдХрд╛ рдорд╛рд▓рд┐рдХ рдирд╣реАрдВ рдорд╛рдирддрд╛ред рдиреАрдЪреЗ рдореИрдВ рдкрд╛рдардХреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рд╕реАрдзреЗ рдЬрд╛рд╡рд╛ рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдгрд╛рд▓реА

Windows XP SP3 32 рдмрд┐рдЯ
D: \ dev \ рдкрд╣реЗрд▓рд┐рдпрд╛рдБ> рдЬрд╛рд╡рд╛ -рд╡рд┐рд╡рд░реНрддрди
рдЬрд╛рд╡рд╛ рд╕рдВрд╕реНрдХрд░рдг "1.6.0_29"
рдЬрд╛рд╡рд╛ (TM) рдПрд╕рдИ рд░рдирдЯрд╛рдЗрдо рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ (рдмрд┐рд▓реНрдб 1.6.0_29-b11)
рдЬрд╛рд╡рд╛ рд╣реЙрдЯрд╕реНрдкреЙрдЯ (рдЯреАрдПрдо) рдХреНрд▓рд╛рдЗрдВрдЯ рд╡реАрдПрдо (20.4-b02, рдорд┐рд╢реНрд░рд┐рдд рдореЛрдб, рд╕рд╛рдЭрд╛рдХрд░рдг)

рдЯреНрд░реЗрдирд┐рдВрдЧ


рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╡рд░реНрдЧ Unsafe рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рдкреНрд░рдпреЛрдЧ рдХрд┐рдП рдЧрдП рдереЗред рд╡рд░реНрдЧ рд╡рд┐рд╡рд░рдг рдХреЛ рдореЛрдЯреЗ рддреМрд░ рдкрд░ wasm.ru рд╕реЗ рдЪреБрд░рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рдж рд╕реЗ рдЕрд▓реНрдк-рдЬреНрдЮрд╛рдд рд╡рд░реНрдЧ sun.misc.Unsafe рдХреЛ Sun Java рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреИрдХреЗрдЬ рд╕рди рдореЗрдВ рдЕрдиреНрдп рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреА рддрд░рд╣ред *, рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдкрдШрдЯрди рдХреЗ рджреМрд░рд╛рди рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо (рдЕрдзрд┐рдХрддрд░ рдореВрд▓) рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддреЗ рд╣реИрдВред рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВ (рдПрдХ рдЖрд╡рдВрдЯрд┐рдд рдкрддреЗ, рдлреНрд░реАрдореЗрдореЛрд░реА, ...), рджрд┐рдП рдЧрдП рдкрддреЗ рдкрд░ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдорд╛рди (рдкреБрдЯреЙрдиреНрдЧ, рдЧреЗрдЯрд▓реЙрдиреНрдЧ, ...), рдФрд░ рдХреБрдЫ рдФрд░ рд╡рд┐рд╢реЗрд╖реАрдХреГрдд (рдереНрд░реИрдХреНрд╕реЗрдкреНрд╢рди, рдореЙрдирд┐рдЯрд░рдЗрдВрдЯрд░, ...)ред

рд▓реЗрдХрд┐рди, Unsafe рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдПрдХрдорд╛рддреНрд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдирд┐рдЬреА рд╣реИ, рдФрд░ getUnsafe () рдореЗрдВ рдХреЙрд▓рд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдХреЗ рдмреВрдЯрд▓реЛрдбрд░ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рддрднреА рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХреНрд▓рд╛рд╕ рдХреЛ рдмреВрдЯрд▓реЛрдбрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рд╣рдореЗрдВ рдПрдХ SecurityException рдорд┐рд▓рддреА рд╣реИред

public static Unsafe getUnsafe() { Class class1 = Reflection.getCallerClass(2); if (class1.getClassLoader() != null) throw new SecurityException("Unsafe"); else return theUnsafe; } 


рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╡рд╣рд╛рдБ рднреА рдЖрдВрддрд░рд┐рдХ рдЪрд░ theUnsafe рд╣реИ, рдЬреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрд╛ ред

 import java.lang.reflect.Field; import sun.misc.Unsafe; public class T { public static Unsafe u; private static long fieldOffset; private static T instance = new T(); private Object obj; static { try { Field f = Unsafe.class.getDeclaredField("theUnsafe"); f.setAccessible(true); u = (Unsafe) f.get(null); fieldOffset = u.objectFieldOffset(T.class.getDeclaredField("obj")); } catch (Exception ex) { throw new RuntimeException(ex); } }; public synchronized static long o2a(Object o) { instance.obj = o; return u.getLong(instance, fieldOffset); } public synchronized static Object a2o(long address) { u.putLong(instance, fieldOffset, address); return instance.obj; } public static Unsafe get() { return u; } } 


рд╣рдореЗрдВ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдбреНрд░реЗрд╕ рд╕реЗ рд▓реЗ рдХрд░ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдПрдбреНрд░реЗрд╕ рд▓реЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реЛрдЧреА: o2a (рдСрдмреНрдЬреЗрдХреНрдЯ o) рдФрд░ a2o (рд▓реЙрдиреНрдЧ рдПрдбреНрд░реЗрд╕)ред
рдЕрдм рдЖрдк рдХреБрдЫ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд╕реНрддреБ рд╕рдВрд░рдЪрдирд╛


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
 import sun.misc.Unsafe; public class V { private Integer b = 3; private int a = 2; public static void main(String[] argv) throws Exception { Unsafe u = T.get(); long obj = T.o2a(new V()); for (int i = 0; i < 28; i++) System.out.print(u.getByte(obj + i) + " "); } } 


рдпрд╣ рдХреЛрдб 2 рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░реЛрдВ (int рдФрд░ Integer) рд╕реЗ рдпреБрдХреНрдд рдПрдХ рд╡рд░реНрдЧ рд╣реИред рд╣рдо рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ, рд╕реНрдореГрддрд┐ рдореЗрдВ рдЗрд╕рдХреЗ рдкрддреЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рдФрд░ 28 рдмрд╛рдЗрдЯреНрд╕ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдерд╛ (рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд┐рдпрд╛)
 01 00 00 00 88 D7 79 32 02 00 00 00 D0 7C E4 22 01 00 00 00 E8 09 19 37 68 6F E4 22 


рддреЛ рд╣рдо рдХреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ:
01 00 00 00 рддрдерд╛рдХрдерд┐рдд рдЬрд╛рджреВ рд╣реИ ред рдпрд╣ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдорд╛рд╕реНрдХ рд╣реИ ред рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реАред
88 D7 79 32 - рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рд╡рд╕реНрддреБ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИред
режреи режреж режреж режреж рд╣рдорд╛рд░реЗ рдЖрджрд┐рдо рдХреНрд╖реЗрддреНрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ int рдХрд╛ рдорд╛рди рд╣реИред
D0 7C E4 22 - рдлрд┐рд░ рд╕реЗ, рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЗрдВрдЯреЗрдЧрд░ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИред
рдФрд░ рдЖрдЧреЗ ... рдЖрдЧреЗ рдпрд╣ рд╕реНрдореГрддрд┐ рдореЗрдВ рдкрд╛рд╕ рдореЗрдВ рдкрдбрд╝реА рдПрдХ рдФрд░ рд╡рд╕реНрддреБ рд╣реИред рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдХрд░, рдЖрдк рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 import sun.misc.Unsafe; public class V { private int a = 2; private Integer b = 777; public static void main(String[] argv) throws Exception { Unsafe u = T.get(); long obj = T.o2a(new V()); for (int i = 0; i < 28; i++) System.out.print(u.getByte(obj + i) + " "); long field = u.getAddress(obj + 3 * 4); Object i = T.a2o(field); System.out.print("\nInteger: " + i); } } 

рдкрд░рд┐рдгрд╛рдо:
 01 00 00 00 98 D6 79 32 02 00 00 00 C8 FB E4 22 ... Integer: 777 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдВрдЯреЗрдЧрд░ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдкрддрд╛ рд▓рд┐рдпрд╛, рдФрд░ рдлрд┐рд░ рдЗрд╕ рдкрддреЗ рдкрд░ рдкрдбрд╝реА рд╣реБрдИ рд╡рд╕реНрддреБ рдХреЛ рд▓рд┐рдпрд╛ред рдкрд░рд┐рдгрд╛рдо рдиреЗ рд╣рдорд╛рд░реА рдзрд╛рд░рдгрд╛рдУрдВ рдХреА рдкреБрд╖реНрдЯрд┐ рдХреАред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рджреВрд╕рд░реЗ рдмреНрд▓реЙрдХ (рд╡рд░реНрдЧ рдкрддреЗ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдорд╛рд░реА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдЧрд╛ред
 import sun.misc.Unsafe; public class V { private int a = 2; private int b = 3; public static void main(String[] argv) throws Exception { Unsafe u = T.get(); long obj = T.o2a(new V()); V v = new V(); va = 5; vb = 6; for (int i = 0; i < 32; i++) System.out.print(u.getByte(obj + i) + " "); } } 

рдкрд░рд┐рдгрд╛рдо:
 01 00 00 00 08 D6 79 32 02 00 00 00 03 00 00 00 01 00 00 00 08 D6 79 32 05 00 00 00 06 00 00 00 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рд╕рдВрджрд░реНрдн рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдХрдХреНрд╖рд╛ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ред 2 рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдмрдирд╛рдП, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдореИрдВрдиреЗ рдЦреЗрддреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрд╛рд╕ рдореЗрдВ рд╕реНрдореГрддрд┐ рдореЗрдВ рдорд┐рд▓рд╛, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЖрджрд┐рдо рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдореВрд▓реНрдп рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг:
 import sun.misc.Unsafe; public class V { public static void main(String[] argv) throws Exception { Unsafe u = T.get(); long obj = T.o2a(new Integer[] {1, 2, 3}); for (int i = 0; i < 28; i++) System.out.print(u.getByte(obj + i) + " "); } } 

 01 00 00 00 B8 C9 79 32 03 00 00 00 40 78 E4 22 50 78 E4 22 60 78 E4 22 ... 

Arrays рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред

рдСрдлрд╕реЗрдЯ рдЙрджрд╛рд╣рд░рдг:
 import sun.misc.Unsafe; public class V { private Integer a = 1; public static void main(String[] argv) throws Exception { Unsafe u = T.get(); long obj = T.o2a(new V()); for (int i = 0; i < 28; i++) System.out.print(u.getByte(obj + i) + " "); } } 

рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛ рдЫреЛрдбрд╝реАред
рдкрд░рд┐рдгрд╛рдо:
 01 00 00 00 B0 D7 79 32 60 78 E4 22 00 00 00 00 01 00 00 00 E8 09 19 37 ... 

рдпрд╣рд╛рдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ 4 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдПрдХ рдЦрд╛рд▓реА рдмреНрд▓реЙрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рди рдХреЗ рд╕рдВрджрд░реНрдн рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИред рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ 8 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП рдЧрджреНрджреЗрджрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдСрдлрд╕реЗрдЯ рдЙрджрд╛рд╣рд░рдг:
 import sun.misc.Unsafe; public class V { private int a = 2; private int b = 3; public static void main(String[] argv) throws Exception { Unsafe u = T.get(); V v = new V(); synchronized (v) { long obj = T.o2a(v); for (int i = 0; i < 32; i++) System.out.print(T.hex(u.getByte(obj + i)) + " "); } } } 

рдпрд╣рд╛рдВ, рдкреНрд░рд╢реНрди рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ рдореЗрдВ рд╣реИ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкрд╣рд▓реЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдореВрд▓реНрдп рдмрджрд▓ рдЧрдпрд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдо:
 8C 84 F0 00 58 D6 79 32 02 00 00 00 03 00 00 00 ... 


рдирд┐рд╖реНрдХрд░реНрд╖


рдЬрд╛рд╡рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдирд┐рдореНрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
4 рдмрд╛рдЗрдЯреНрд╕ - рдореИрдЬрд┐рдХ рдорд╛рд╕реНрдХред
4 рдмрд╛рдЗрдЯреНрд╕ - рдХреНрд▓рд╛рд╕ рдХрд╛ рдкрддрд╛ред
4 рдмрд╛рдЗрдЯреНрд╕ рд╕рд░рдгреА рдХрд╛ рдЖрдХрд╛рд░ рд╣реИ (рдХреЗрд╡рд▓ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ)ред
n * 4 рдмрд╛рдЗрдЯреНрд╕ - рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП (рдПрдХ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореВрд▓реНрдп рдпрд╛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рдВрджрд░реНрдн)ред
рдпрд╣ рд╕рдм 8 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдПрдХ рдХрд╛рд░рдХ рдХреЗ рд▓рд┐рдП рдкреВрд░рдХ рд╣реИред

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

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


All Articles