рдЙрджрд╛рд╣рд░рдг рдХреЗ рджреНрд╡рд╛рд░рд╛ D рдФрд░ C ++ рдФрд░ Rust рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛

рдпрд╣ рдкреЛрд╕реНрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рд░рд╕реНрдЯ рдФрд░ C ++ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдорддрднреЗрджреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдбреА рдХреЛрдб рдХреЗ рд╕рд╛рде рд╡рд╣рд╛рдВ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкреВрд░рдХ рдХрд░рддрд╛ рд╣реИред



рд╕рднреА рдЙрджрд╛рд╣рд░рдг DMD v2.065 x86_64 рд╕рдВрдХрд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рдЧрдП рдереЗред



рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛





Rust рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯреНрд╕ рдХреЛ рддреНрд╡рд░рд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╢реБрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЕрд▓рдЧрд╛рд╡ рд╣реЛрддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп / рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдФрд░ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рд╕реНрдерд╛рди рдкрд░, рдЬрд╣рд╛рдБ рдЖрдк рд╕рднреА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реИред рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдкреНрд░рдХрд╛рд░:

trait Sortable {} fn sort<T: Sortable>(array: &mut [T]) {} fn main() { sort(&mut [1,2,3]); }
      
      









рдбреА рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: рдЖрдк рдЯреЗрдореНрдкреНрд▓реЗрдЯ, рдлрд╝рдВрдХреНрд╢рдВрд╕, рд╕рдВрд░рдЪрдирд╛рдУрдВ рдкрд░ рдЧрд╛рд░реНрдб рд▓рдЯрдХрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдУрд╡рд░рд▓реЛрдб рд╕реЗрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХ рджреЗрдЧрд╛ рдпрджрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИред

 import std.traits; // auto sort(T)(T[] array) {} -   guard  auto sort(T)(T[] array) if(isFloatingPoint!T) {} void main() { sort([1,2,3]); }
      
      







рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдЧрд╛:

source / main.d (27): рддреНрд░реБрдЯрд┐: рдЯреЗрдореНрдкрд▓реЗрдЯ main.sort рддрд░реНрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдШрдЯрд╛ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ! () (int []), рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИрдВ:

source / main.d (23): main.sort (T) (T [] array) рдЕрдЧрд░ (isFloatingPoint! T)





рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рд░реВрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рд╕рдорд╛рди "рд╕рдорд╛рдзрд╛рди" рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 template Sortable(T) { // ,   ,    swap    enum Sortable = __traits(compiles, swap(T.init, T.init)); //       static assert(Sortable, "Sortable isn't implemented for "~T.stringof~". swap function isn't defined."); } auto sort(T)(T[] array) if(Sortable!T) {} void main() { sort([1,2,3]); }
      
      





рд╕рдВрдХрд▓рдХ рдЖрдЙрдЯрдкреБрдЯ:

source / main.d (41): рдПрд░рд░: рд╕реНрдЯреИрдЯрд┐рдХ рдЕрд╕реЙрд░реНрд╕ "Sortable is not for intред рд╕реНрд╡реИрдк рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред "

source / main.d (44): рдпрд╣рд╛рдБ рд╕реЗ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ: рдХреНрд░рдордмрджреНрдз! int

source / main.d (48): рдпрд╣рд╛рдБ рд╕реЗ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ: рд╕реЙрд░реНрдЯ! ()





рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд▓рдЧрднрдЧ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд▓реЛрдореАрдЯрд░ рдХреЗ рд▓реЙрдЧ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдРрд╕реА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдХреА рдХреАрдордд рдЕрдзрд┐рдХ рд╣реИ - рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреА рдкреНрд░рдпреЛрдЬреНрдпрддрд╛ рдХреА рд╕реАрдорд╛ рдкрд░ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╕рдВрджреЗрд╢ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ T рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдкреНрд░рдХрд╛рд░, рд▓реИрдореНрдмреНрдбрд╛, рдПрдХ рдЕрдиреНрдп рдЯреЗрдореНрдкреНрд▓реЗрдЯ (рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЖрджрд┐), рдпрд╣ рдЖрдкрдХреЛ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ), рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рд╕реВрдЪреА - рдЕрдХреНрд╕рд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╡рд┐рдХреГрдд рдХрд▓реНрдкрдирд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддрд╛ рд╣реИред



рд░рд┐рдореЛрдЯ рдореЗрдореЛрд░реА рддрдХ рдкрд╣реБрдВрдЪ



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



рдореЙрд▓реЙрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ C-shn рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ:

 import std.c.stdlib; void main() { auto x = cast(int*)malloc(int.sizeof); //       scope scope(exit) free(x); //       free(x); *x = 0; }
      
      





*** 'рдбреЗрдореЛ' рдореЗрдВ рддреНрд░реБрдЯрд┐: рдбрдмрд▓ рдореБрдХреНрдд рдпрд╛ рднреНрд░рд╖реНрдЯрд╛рдЪрд╛рд░ (рдлрд╛рд╕реНрдЯрдЯреЙрдк): 0x0000000001b02650 ***




рдбреА рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░реЛрдВ рдкрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреЛрдбрд╛рдВрддрд░рдХ рддрдХред рд╣рдо GC рдХреЛ рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ - рд╣рдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реЗрдгреА рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд▓реЗрддреЗ рд╣реИрдВ: рд▓реАрдХ, рджреВрд░рд╕реНрде рдореЗрдореЛрд░реА рддрдХ рдкрд╣реБрдВрдЪред RAII (рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рджрд╛рдпрд░рд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕рд┐рд░рджрд░реНрдж рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред



рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдбреА рдХреБрдХрдмреБрдХ рдореЗрдВ рдореИрдиреБрдЕрд▓ рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рдХрд╕реНрдЯрдо рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдбреА рдореЗрдВ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдиреЗ (рдЬреАрд╕реА рдХреЗ рдмрд┐рдирд╛ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдХреЗ рдмрд┐рдирд╛) рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдФрд░ рдЬреАрд╕реА рдХреЗ рдкреВрд░реНрдг рдкрд░рд┐рддреНрдпрд╛рдЧ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдмреЗрдХрд╛рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╢реБрд░реВ рдореЗрдВ рдЙрдирдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдВрдмреЗрдбреЗрдб рд╕реНрдЯрд╛рдЗрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╕реНрдерд╛рди рдЕрднреА рднреА рдЦрд╛рд▓реА рд╣реИред



рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ рдЦреЛ рджрд┐рдпрд╛ рд╣реИ



рдЬрдВрдЧ рд╕рдВрд╕реНрдХрд░рдг:

 fn bar<'a>(p: &'a int) -> &'a int { return p; } fn foo(n: int) -> &int { bar(&n) } fn main() { let p1 = foo(1); let p2 = foo(2); println!("{}, {}", *p1, *p2); }
      
      









рдбреА рдкрд░ рдПрдирд╛рд▓реЙрдЧ (рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдкреЛрд╕реНрдЯ рд╕реНрд░реЛрдд рд╕реЗ C ++ рдкрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ):

 import std.stdio; int* bar(int* p) { return p; } int* foo(int n) { return bar(&n); } void main() { int* p1 = foo(1); int* p2 = foo(2); writeln(*p1, ",", *p2); }
      
      





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

2.2




рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЬрдВрдЧ рдХрд╛ рдПрдХ рдлрд╛рдпрджрд╛ рд╣реИ, рдореБрдЭреЗ рдРрд╕реА рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЪрд░ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХрд╛ рдЗрддрдирд╛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдбреА рдХреЗ рдмрдЪрд╛рд╡ рдореЗрдВ рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣реА рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рдореЛрдб рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд┐рдЫрд▓реЗ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

рддреНрд░реБрдЯрд┐: @ рд╕реБрд░рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдлреВ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ n рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓реЗ рд╕рдХрддрд╛




рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбреА рдХреЗ рд▓рд┐рдП 90% рдХреЛрдб рдореЗрдВ, рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдирд┐рдореНрди рд╕реНрддрд░ - рдЙрдЪреНрдЪ рдЬрд┐рдореНрдореЗрджрд╛рд░реА), рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рд░реЗрдлрд░реА рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 import std.stdio; ref int bar(ref int p) { return p; } ref int foo(int n) { return bar(n); } void main() { auto p1 = foo(1); auto p2 = foo(2); writeln(p1, ",", p2); }
      
      





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




рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ



рд╕реА ++

 #include <stdio.h> int minval(int *A, int n) { int currmin; for (int i=0; i<n; i++) if (A[i] < currmin) currmin = A[i]; return currmin; } int main() { int A[] = {1,2,3}; int min = minval(A,3); printf("%d\n", min); }
      
      









D рдореЗрдВ, рд╕рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЛ T.init рдорд╛рди рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ рдХреЛ рдпрд╣ рдмрддрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрд░рдВрднреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:

 import std.stdio; int minval(int[] A) { int currmin = void; // undefined behavior foreach(a; A) if (a < currmin) currmin = a; return currmin; } void main() { auto A = [1,2,3]; int min = minval(A); writeln(min); }
      
      







рд╕рдХрд╛рд░рд╛рддреНрдордХ рдмрд┐рдВрджреБ: рдкреИрд░ рдореЗрдВ рд╢реВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЪрд╛рд╣рд┐рдПред рдбреА (рд╢рд╛рдпрдж рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдореЗрдВ рдПрдХ рдЪрд░ рдХреЛ рдЧрд▓рддреА рд╕реЗ рдПрдХрд╛рдВрддрд░ рдХрд░рдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИред



рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдЕрдзрд┐рдХ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ (рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛) рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 fn minval(A: &[int]) -> int { A.iter().fold(A[0], |u,&a| { if a<u {a} else {u} }) }
      
      









рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, D рдкрд░ рд╡рд┐рдХрд▓реНрдк:

 int minval(int[] A) { return A.reduce!"a < b ? a : b"; //  //return A.reduce!((a,b) => a < b ? a : b); }
      
      







рдирдХрд▓рдЪреА рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛



рд╕реА ++

 struct A{ int *x; A(int v): x(new int(v)) {} ~A() {delete x;} }; int main() { A a(1), b=a; }
      
      









D рдкрд░ рд╕рдорд╛рди рд╕рдВрд╕реНрдХрд░рдг:

 struct A { int *x; this(int v) { x = new int; *x = v; } } void main() { auto a = A(1); auto b = a; *bx = 5; assert(*ax == 1); // fails }
      
      







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

  this(this) //        this { //        auto newx = new int; *newx = *x; x = newx; }
      
      







рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкреГрдердХреНрдХрд░рдг рд╣реИ: рдпрджрд┐ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╢рдмреНрджрд╛рд░реНрде рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдЬреИрд╕реЗ рдХрд┐ рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП - рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ (рдПрдХ рдЕрдиреБрд╡рд╛рдж рд╣реИ ) рдХреА рдкреБрд╕реНрддрдХ рдореЗрдВ , рдЗрди рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИред



рдЬрдВрдЧ рддреБрдореНрд╣рд╛рд░реА рдкреАрда рдХреЗ рдкреАрдЫреЗ рдХреБрдЫ рдирд╣реАрдВ рдХрд░реЗрдЧреАред Eq рдпрд╛ рдХреНрд▓реЛрди рдХрд╛ рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдмрд╕ рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╡реНрдпреБрддреНрдкрдиреНрди рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ:

 #[deriving(Clone, Eq, Hash, PartialEq, PartialOrd, Ord, Show)] struct A{ x: Box<int> }
      
      







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



рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░



 #include <stdio.h> struct X { int a, b; }; void swap_from(X& x, const X& y) { xa = yb; xb = ya; } int main() { X x = {1,2}; swap_from(x,x); printf("%d,%d\n", xa, xb); }
      
      







рдпрд╣ рд╣рдореЗрдВ рджреЗрддрд╛ рд╣реИ:

2.2






рд╕рдорд╛рди рдбреА рдХреЛрдб рдЬреЛ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

 struct X { int a, b; } void swap_from(ref X x, const ref X y) { xa = yb; xb = ya; } void main() { auto x = X(1,2); swap_from(x, x); writeln(xa, ",", xb); }
      
      







рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдВрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬреАрдд рдЬрд╛рддреА рд╣реИред рдореБрдЭреЗ рдбреА рдореЗрдВ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдореЗрдореЛрд░реА рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ред



рдмрд┐рдЦрд░рд╛ рд╣реБрдЖ рдЗрдЯрд░реЗрдЯрд░



рдбреА рдореЗрдВ, рдЗрдЯрд░реНрдЪрд░ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рдХреЛ рд░рдВрдЧ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЖрдЗрдП рдкрд╛рд╕ рд╣реЛрдиреЗ рдкрд░ рдХрдВрдЯреЗрдирд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:

 import std.stdio; void main() { int[] v; v ~= 1; v ~= 2; foreach(val; v) { if(val < 5) { v ~= 5 - val; } } writeln(v); }
      
      





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

[рез, реи, рек, рей]




рд░реЗрдВрдЬ рдПрд░реЗ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп, рдкрд░рд┐рдгрд╛рдореА рд╡рд╛рд▓рд╛ рдкрд╣рд▓реЗ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдлрд╝реЙрд░рдЪ рдмреНрд▓реЙрдХ рдХреЛ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рдпрд╣ рд░реЗрдВрдЬ "рдкреБрд░рд╛рдиреЗ" рдПрд░реЗ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ред рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╕рд░рдгреА рдХреА рдкреВрдВрдЫ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:



 import std.stdio; import std.container; void main() { DList!int v; v.insert(1); v.insert(2); foreach(val; v[]) //  []  range { if(val < 5) { v.insertFront(5 - val); v.insertBack(5 - val); } } writeln(v[]); }
      
      





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

[рей, рек, рез, реи, рек, рей]




рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рджреЛрдЧреБрдиреА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЗрд╕рдХреА рдкреБрди: рд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рддрд╛ рд╣реИ, рдкреБрд░рд╛рдиреА рд╢реНрд░реЗрдгреА рдкреБрд░рд╛рдиреА рд╕рд░рдгреА рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреА рд╣реИ, рдФрд░ рд╣рдо рд╕рд░рдгреА рдХреА рдирдИ рдкреНрд░рддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЬреАрд╕реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рд╣рдо рдореЗрдореЛрд░реА рдореЗрдВ рд▓рдЯрдХрд╛ рдмрд┐рдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдФрд░ рд╕реВрдЪреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреВрд░реА рд╕реНрдореГрддрд┐ рдХреА рдкреБрдирдГ рдкреНрд░рд╛рдкреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдирдП рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдПред



рдЦрддрд░рдирд╛рдХ рд╕реНрд╡рд┐рдЪ



 #include <stdio.h> enum {RED, BLUE, GRAY, UNKNOWN} color = GRAY; int main() { int x; switch(color) { case GRAY: x=1; case RED: case BLUE: x=2; } printf("%d", x); }
      
      





рд╣рдореЗрдВ рдПрдХ "2" рджреЗрддрд╛ рд╣реИред рдЬрдВрдЧ рдореЗрдВ, рдЖрдкрдХреЛ рдирдореВрдиреЗ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╕рдордп рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрдб рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдЧрд▓реЗ рд╡рд┐рдХрд▓реНрдк рдкрд░ рдирд╣реАрдВ рдЪрдврд╝рддрд╛ рд╣реИ рдЕрдЧрд░ рдпрд╣ рдмреНрд░реЗрдХ рд╕реЗ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред





рдбреА рдореЗрдВ, рдЕрдВрддрд┐рдо рдХреАрд╡рд░реНрдб рд╕реНрд╡рд┐рдЪ рд╕реЗ рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдкрдХреЛ рд╕рднреА рдорд┐рд▓рд╛рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛ред рдЕрдВрддрд┐рдо рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдПрдХ рд╢рд░реНрдд рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмреНрд▓реЙрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрдХрд▓рдХ рдХреЗ рд╣рд╛рд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдЕрдЧрд▓реЗ рд▓реЗрдмрд▓ рдкрд░ рдПрдХ рдирд┐рд╣рд┐рдд "рдбреБрдмрдХреА" рдХреЛ рдкрджрд╛рд╡рдирдд рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЧреЛрдЯреЛ рдорд╛рдорд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 import std.stdio; enum Color {RED, BLUE, GRAY, UNKNOWN} Color color = Color.GRAY; void main() { int x; final switch(color) { case Color.GRAY: x = 1; case Color.RED: case Color.BLUE: x = 2; } writeln(x); }
      
      





рд╕рдВрдХрд▓рдХ рдЖрдЙрдЯрдкреБрдЯ:

source / main.d (227): рддреНрд░реБрдЯрд┐: рдПрдирдо рд╕рджрд╕реНрдп UNKNOWN рдЕрдВрддрд┐рдо рд╕реНрд╡рд┐рдЪ рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛

source / main.d (229): рдЪреЗрддрд╛рд╡рдиреА: рд╕реНрд╡рд┐рдЪ рдХреЗрд╕ рдлрд╛рд▓рддреВ - 'рдЧреЛрдЯреЛ рдХреЗрд╕;' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрджрд┐ рдЗрд░рд╛рджрд╛ рд╣реЛ

source / main.d (229): рдЪреЗрддрд╛рд╡рдиреА: рд╕реНрд╡рд┐рдЪ рдХреЗрд╕ рдлрд╛рд▓рддреВ - 'рдЧреЛрдЯреЛ рдХреЗрд╕;' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрджрд┐ рдЗрд░рд╛рджрд╛ рд╣реЛ




рд░реИрдВрдбрдо рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо



 int main() { int pixels = 1; for (int j=0; j<5; j++); pixels++; }
      
      







рдЬрдВрдЧ рдореЗрдВ, рдЖрдкрдХреЛ рдЫреЛрд░реЛрдВ рдФрд░ рддреБрд▓рдирд╛ рдХреЗ рдирд┐рдХрд╛рдпреЛрдВ рдХреЛ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдПрдХ рддрд┐рдкрд╣рд┐рдпрд╛, рдмреЗрд╢рдХ, рд▓реЗрдХрд┐рди рдПрдХ рдХрдо рддреНрд░реБрдЯрд┐ рд╡рд░реНрдЧред





рдбреА рдореЗрдВ, рд╕рдВрдХрд▓рдХ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЪреЗрддрд╛рд╡рдиреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ) рдФрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддрд╛ рд╣реИ; {} рдкрд░ред



рдмрд╣реБ рд╕реВрддреНрд░рдг



 #include <stdio.h> #include <pthread.h> #include <unistd.h> class Resource { int *value; public: Resource(): value(NULL) {} ~Resource() {delete value;} int *acquire() { if (!value) { value = new int(0); } return value; } }; void* function(void *param) { int *value = ((Resource*)param)->acquire(); printf("resource: %p\n", (void*)value); return value; } int main() { Resource res; for (int i=0; i<5; ++i) { pthread_t pt; pthread_create(&pt, NULL, function, &res); } //sleep(10); printf("done\n"); }
      
      







рдПрдХ рдХреЗ рдмрдЬрд╛рдп рдХрдИ рд╕рдВрд╕рд╛рдзрди рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:

рдХрд┐рдпрд╛

рд╕рдВрд╕рд╛рдзрди: 0x7f229c0008c0

рд╕рдВрд╕рд╛рдзрди: 0x7f22840008c0

рд╕рдВрд╕рд╛рдзрди: 0x7f228c0008c0

рд╕рдВрд╕рд╛рдзрди: 0x7f22940008c0

рд╕рдВрд╕рд╛рдзрди: 0x7f227c0008c0







рдбреА рдореЗрдВ, рд░рд╕реНрдЯ рдХреА рддрд░рд╣, рд╕рдВрдХрд▓рдХ рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рднреА рдореЗрдореЛрд░реА рдЕрд╡рд┐рднрд╛рдЬреНрдп рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рдЕрдкрдиреА рдкреНрд░рддрд┐ (рдЬреЛ рдЯреАрдПрд▓рдПрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рднреА рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП D рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:

 import std.concurrency; import std.stdio; class Resource { private int* value; int* acquire() { if(!value) { value = new int; } return value; } } void foo(shared Resource res) { // Error: non-shared method main.Resource.acquire is not callable using a shared object writeln("resource ", res.acquire); } void main() { auto res = new shared Resource(); foreach(i; 0..5) { spawn(&foo, res); } writeln("done"); }
      
      







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

 synchronized class Resource { private int* value; shared(int*) acquire() { if(!value) { value = new int; } return value; } }
      
      







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

рдХрд┐рдпрд╛

рд╕рдВрд╕рд╛рдзрди 7FDED3805FF0

рд╕рдВрд╕рд╛рдзрди 7FDED3805FF0

рд╕рдВрд╕рд╛рдзрди 7FDED3805FF0

рд╕рдВрд╕рд╛рдзрди 7FDED3805FF0

рд╕рдВрд╕рд╛рдзрди 7FDED3805FF0




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



рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛



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



рд░рд╕реНрдЯ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбреА рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд▓рд┐рдВрдХ рдЖрдЬреАрд╡рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдХрд╛рдордирд╛ рдХрд░рддрд╛ рд╣реВрдВред рдЗрди рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ "рд╕рд╛рдВрд╕реНрдХреГрддрд┐рдХ" рд╡рд┐рдирд┐рдордп рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдн рджреЗрдЧрд╛ред



рдЬреАрд╕реА рдФрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП ReklatsMasters рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред



All Articles