이동을 설명하기전에 먼저 소유권을 알아야한다. 하나의 변수의 값에는 하나의 소유권이 있다. 파이썬과 C++ 코드 비교를 통해 소유권을 알아보자
먼저 파이썬 코드를 보면
s = ['피자', '치킨', '콜라']
t = s
u = s
리스트 s 가 t,u 에 할당 되면서 래퍼런스 카운터가 증가되어 3을 갱신한다. 값을 해체할때는 시점을 알기위해서는 반드시 래퍼런스 카운트를 유지시켜야 한다.
C++ 코드를 보면
using namespace std;
vector<string> s = { "피자", "치킨", "콜라"};
vector<string> t = s;
vector<string> u = s;
std::vector는 백터의 복사본이 만들어지고 std::string도 비슷하게 작동한다. 벡터3개와 문자열 총 9를 할당하게 된다.
https://www.yes24.com/Product/Goods/116789691
프로그래밍 러스트 99쪽 = C++와 파이썬은 상반된 장단점을 택했다고 할 수 있다. 파이썬은 배정할 때 비용이 거의 들지 않지만, 래퍼런스 카운팅이 필요하다. C++는 모든 메모리의 소유권을 명확하게 유지하지만(앞에선 본 백터의 복사본과 문자열), 배정할 때 객체에 대해서 깊은 복사를 수행해야 한다.
러스트 코드를 보면
let s = vec!["피자".to_string(), "치킨".to_string(), "콜라".to_string()];
let t = s;
let u = s;
변수 s에 3개의 벡터가 s에서 t로 옮겨서 이제 t가 벡터의 소유권을 가지게 된다 그러므로 u는 소유권을 가질 수 없게 된다.
파이썬처럼 비용이 들지 않고 C++처럼 소유권이 항상 명확하다 그리고 C++과 러스트에 차이점에 있어서 C++는 배정,매개변수 전달, 함수의 값 반환,깊은복사와 같은 기본 연산의 비용을 예측하기 힘들다 하지만 러스트는 타입이 명확하고 비용을 명확히 알 수 있어서 좋다
Copy타입 : 이동의 예외
러스트 얕은 복사를 구현한 예 여기서 정수, 부동 소수점등의 숫자타입,Boolean타입 등은 소유권 시스템이 동작하지 않는다. 그래서 이동되지 않고 복사가 가능하다
#[derive(Copy, Clone)] // 타입을 카피로 만든다
struct Label {
number: u32, //타입 명시 , name:string으로 하면 컴파일 오류가 뜬다
}
fn main() {
let l = Label { number: 3 };
print(l);
println!("My label number is: {}", l.number)
}
fn print(l: Label) {
println!("STAMP: {}", l.number)
}
'Rust' 카테고리의 다른 글
러스트 모듈(pub mod) (0) | 2024.01.09 |
---|---|
러스트 제네릭(generic) 함수 정의 (0) | 2024.01.01 |
러스트 프로그래밍 - 스코프를 벗어나면 drop (0) | 2023.12.18 |
러스트 프로그래밍 - 참조 & 와 빌림(borrow) (0) | 2023.12.17 |
러스트 프로그래밍 - 힙(heap)영역과 스택(stack)영역 (0) | 2023.12.17 |