박스 변수
개발자는 변수를 스택(stack)에 할당할지, 힙(heap)에 할당할지 변수 타입을 먼저 결정 해야한다. 본 내용은 힙을 사용하는 경우이다.
Rc<T>, Box<T>는 다음과 같다:
- 공통
- 힙 사용: 실제값이 저장되는 공간이다.
- 힙 포인터 사용(usize): 힙 공간을 참조하는 변수가 스택 공간에 할당된다.
- 재귀적 정의타입이여서 컴파일 시간에 크기를 알 수 없을 때 사용한다. 예) List
- 차이점:
- 데이터 소유권 개수
- Box<T>는 1개
- Rc<T>는 여러개
- Box<T>:
- 변수 영역이 벗어나면 자동 해제가 된다. 컴파일 시간에 변수의 생명주기가 계산 가능하다.
- 힙 내부 데이터 수정이 가능하다.
- Rc<T>:
- 불변 참조(immutable reference):
- 힙 내부의 값을 수정할 수는 없다.
- 여러 영역에서 소유권을 가질 수 있다:
- 소유권이 동적으로 공유한다. 내부적으로 참조 횟수를 세고 있어서, 0이되면 할당된 메모리가 해제가 된다.
- 순환 참조를 조심해야 한다. 대안으로 Weak<T>를 쓸 수 있다.
스택
부연하면, 스택을 사용할 경우, 짧은 생의 작은 크기를 보통 사용하기 위해서 활용한다. 그리고 FILO(first-in, last-out)의 특성을 가진다. 스택에 변수를 조작하면, 사용하는 변수의 크기를 이미 알 고 있어야 한다. 스택에 있는 변수를 함수의 인자로 넘길경우, 보통 값으로 주고 받는다. 즉, 스택에 값을 복제한다.
힙
큰 크기를 공간을 할당할때 사용하고, 순서가 없다. 또한 힙의 접근은 주소를 사용해서 한다. 보통 이 주소를 가지고 있는 변수를 포인터라고 한다. 하지만, 힙에 접근하기위한 포인터(레퍼런스)는 스택에 저장된다. 그러므로 컴파일 시간에 포인터 변수 자체의 크기는 알 수 있다. 다만, 힙에 저장된 데이터의 크기는 런타임 시간에 알 수 밖에 없다.
댓글 없음:
댓글 쓰기