Move λ¬Έλ²
(λ³μμ) ν λΉμ _μμ κΆ_μ λ³μ κ°μ μ΄λμν΅λλ€:
fn main() { let s1: String = String::from("Hello!"); let s2: String = s1; println!("s2: {s2}"); // println!("s1: {s1}"); }
s1
μs2
μ ν λΉνμ¬ μμ κΆμ μ΄μ μν΅λλ€.s1
μ μ€μ½νκ° μ’ λ£λλ©΄ μ무 μΌλ μμ΅λλ€: μλνλ©΄s1
μ μλ¬΄λ° μμ κΆμ΄ μκΈ° λλ¬Έμ λλ€.s2
μ μ€μ½νκ° μ’ λ£λλ©΄ λ¬Έμμ΄ λ°μ΄ν°λ ν΄μ λ©λλ€.
s2
λ‘ μ΄λ μ λ©λͺ¨λ¦¬:
s2
λ‘ μ΄λ ν λ©λͺ¨λ¦¬:
κ°μ ν¨μμ μ λ¬ν λ, κ·Έ κ°μ λ§€κ°λ³μμ ν λΉλ©λλ€. μ΄λ μμ κΆμ μ΄λμ΄ μΌμ΄λ©λλ€:
fn say_hello(name: String) { println!("μλ νμΈμ {name}") } fn main() { let name = String::from("Alice"); say_hello(name); // say_hello(name); }
-
μ΄λ C++κ³Ό μ λ°λ μμ μ€λͺ νμΈμ. C++μμλ 볡μ¬κ° κΈ°λ³Έμ΄κ³ ,
std::move
λ₯Ό μ΄μ©ν΄μΌλ§ (κ·Έλ¦¬κ³ μ΄λ μμ±μκ° μ μλμ΄ μμ΄μΌλ§!) μμ κΆ μ΄μ μ΄ λ©λλ€. -
μ€μ λ‘ μ΄λλλ κ²μ μμ κΆμΌ λΏμ λλ€. λ¨Έμ μ½λ λ 벨μμ λ°μ΄ν° 볡μ¬κ° μΌμ΄λ μ§ λ§ μ§μ λν κ²μ μ»΄νμΌλ¬ λ΄λΆμμ μΌμ΄λλ μ΅μ ν λ¬Έμ μ λλ€. μ΄λ° 볡μ¬λ μ΅μ ν κ³Όμ μμ μ κ±°κ° λ©λλ€.
-
μ μμ κ°μ κ°λ¨ν κ°λ€μ
Copy
(λ€μ μ€λͺ ν©λλ€)λ‘ λ§νΉλ μ μμ΅λλ€. -
λ¬μ€νΈμμλ 볡μ¬ν λμλ λͺ μμ μΌλ‘
clone
μ μ¬μ©ν©λλ€.
say_hello
μ:
say_hello
ν¨μμ 첫λ²μ§Έ νΈμΆμmain
ν¨μλ μμ μ΄ κ°μ§name
μ λν μμ κΆμ ν¬κΈ°νλ―λ‘, μ΄νmain
ν¨μμμλname
μ μ¬μ©ν μ μμ΅λλ€.name
μ ν λΉλμλ ν λ©λͺ¨λ¦¬λsay_hello
ν¨μμ λμμ ν΄μ λ©λλ€.main
ν¨μμμname
μ μ°Έμ‘°λ‘ μ λ¬(λΉλ¦Ό)νκ³ (&name
),say_hello
μμ λ§€κ°λ³μλ₯Ό μ°Έμ‘°νμΌλ‘ μμ νλ€λ©΄main
ν¨μλname
μ μμ κΆμ μ μ§ν μ μμ΅λλ€.- λλ 첫λ²μ§Έ νΈμΆ μ
main
ν¨μμμname
μ 볡μ νμ¬ μ λ¬ν μλ μμ΅λλ€.(name.clone()
) - λ¬μ€νΈλ μ΄λμ κΈ°λ³ΈμΌλ‘ νκ³ λ³΅μ λ₯Ό λͺ μμ μΌλ‘ μ μΈνλλ‘ λ§λ¬μΌλ‘, μλμΉ μκ² λ³΅μ¬λ³Έμ λ§λλ κ²μ΄ C++μμλ³΄λ€ μ΄λ ΅μ΅λλ€.
λ μ΄ν΄λ³΄κΈ°
Defensive Copies in Modern C++
Modern C++μ μ΄ λ¬Έμ λ₯Ό λ€λ₯΄κ² ν΄κ²°ν©λλ€:
std::string s1 = "Cpp";
std::string s2 = s1; // s1μ λ°μ΄ν°λ₯Ό 볡μ ν©λλ€.
s1
μ ν λ°μ΄ν°λ 볡μ λκ³ ,s2
λ λ 립μ μΈ λ³΅μ¬λ³Έμ μ»μ΅λλ€.s1
μs2
μ μ€μ½νκ° μ’ λ£λλ©΄ κ°κ°μ λ©λͺ¨λ¦¬κ° ν΄μ λ©λλ€.
λ³΅μ¬ μ :
λ³΅μ¬ ν:
ν€ ν¬μΈνΈ:
-
C++λ Rustμ μ½κ° λ€λ₯Έ μ νμ νμ΅λλ€.
=
λ λ°μ΄ν°λ₯Ό 볡μ¬νλ―λ‘ λ¬Έμμ΄ λ°μ΄ν°κ° ν΄λ‘ λμ΄μΌ ν©λλ€. κ·Έλ μ§ μμΌλ©΄ λ¬Έμμ΄ μ€ νλκ° λ²μλ₯Ό λ²μ΄λ λ double-freeκ° λ°μν©λλ€. -
C++μλ κ°μ μ΄λν μ μλ μμ μ λνλ΄λ λ° μ¬μ©λλ
std::move
λ μμ΅λλ€. μκ°s2 = std::move(s1)
μ΄μλ€λ©΄ ν ν λΉμ΄ λ°μνμ§ μμ΅λλ€. μ΄λ νμλs1
μ΄ μ ν¨νμ§λ§ μ§μ λμ§ μμ μνκ° λ©λλ€. Rustμ λ¬λ¦¬ νλ‘κ·Έλλ¨Έλs1
μ κ³μ μ¬μ©ν μ μμ΅λλ€. -
Rustμ λ¬λ¦¬, C++μ
=
λ 볡μ¬λκ±°λ μ΄λλλ νμ μ λ°λΌ κ²°μ λ μμμ μ½λλ₯Ό μ€νν μ μμ΅λλ€.