๋น๋ฆผ
ํจ์ ํธ์ถ์ ๊ฐ์ ์์ ๊ถ์ ์ด๋ํ๋ ๋์ ์ ํจ์๊ฐ ๊ฐ์ ๋น๋ ค์ฌ ์ ์์ต๋๋ค:
#[derive(Debug)] struct Point(i32, i32); fn add(p1: &Point, p2: &Point) -> Point { Point(p1.0 + p2.0, p1.1 + p2.1) } fn main() { let p1 = Point(3, 4); let p2 = Point(10, 20); let p3 = add(&p1, &p2); println!("{p1:?} + {p2:?} = {p3:?}"); }
add
ํจ์๋ ๋Point
๊ฐ์ฒด ๊ฐ์ _๋น๋ ค_์์ ์๋ก์ดPoint
๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.p1
๊ณผp2
์ ์์ ๊ถ์ ์ฌ์ ํ ํธ์ถ์(main
ํจ์)์ ์์ต๋๋ค.
์คํ์ ํ ๋น๋ ๊ฐ์ ๋ฆฌํดํ๋ ๊ฒ์ ๋ํ ์ฐธ๊ณ :
-
add
์์ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ์ด ์ธ๋ค๋ ๊ฒ์ ์ค๋ช ํ์ธ์. ์๋ํ๋ฉด, ์ปดํ์ผ๋ฌ๊ฐ ๋ณต์ฌ ๊ณผ์ ์ ์๋ตํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ์ฝ๋๋ฅผ ์คํ ์ฃผ์๋ฅผ ์ถ๋ ฅํ๋๋ก ์์ ํ๊ณ Playground์์ ์ํํด ๋ณด์ธ์. ๋๋ Godbolt์์ ์ด์ ๋ธ๋ฆฌ๋ฅผ ํ์ธํด ๋ณด์ธ์. ์ต์ ํ ๋ ๋ฒจ์ด โDEBUGโ ์ผ ๋์๋ ์ฃผ์๊ฐ ๋ฐ๋์ง๋ง, โRELEASEโ ๋ ๋ฒจ์์๋ ๋ฐ๋์ง ์์ต๋๋ค:#[derive(Debug)] struct Point(i32, i32); fn add(p1: &Point, p2: &Point) -> Point { let p = Point(p1.0 + p2.0, p1.1 + p2.1); println!("&p.0: {:p}", &p.0); p } pub fn main() { let p1 = Point(3, 4); let p2 = Point(10, 20); let p3 = add(&p1, &p2); println!("&p3.0: {:p}", &p3.0); println!("{p1:?} + {p2:?} = {p3:?}"); }
-
๋ฌ์คํธ ์ปดํ์ผ๋ฌ๋ ๋ฐํ๊ฐ ์ต์ ํ(RVO)๋ฅผ ์ํํ ์ ์์ต๋๋ค.
-
C++์์ copy elision์ ์์ฑ์์ ๋ถ์ํจ๊ณผ ๊ฐ๋ฅ์ฑ์ด ์์ด ์ธ์ด๋ ๋ฒจ์ ์ ์๊ฐ ํ์ํ์ง๋ง ๋ฌ์คํธ์์๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ๋ง์ฝ RVO๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด ๋ฌ์คํธ๋ ํญ์ ๊ฐ๋จํ๊ณ ํจ์จ์ ์ธ
memcpy
๋ณต์ฌ๋ฅผ ์ํํ ๊ฒ์ ๋๋ค.