Rust에서 Rc와 Box

박스 변수

개발자는 변수를 스택(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)의 특성을 가진다. 스택에 변수를 조작하면, 사용하는 변수의 크기를 이미 알 고 있어야 한다. 스택에 있는 변수를 함수의 인자로 넘길경우, 보통 값으로 주고 받는다. 즉, 스택에 값을 복제한다. 

큰 크기를 공간을 할당할때 사용하고, 순서가 없다. 또한 힙의 접근은 주소를 사용해서 한다. 보통 이 주소를 가지고 있는 변수를 포인터라고 한다. 하지만, 힙에 접근하기위한 포인터(레퍼런스)는 스택에 저장된다. 그러므로 컴파일 시간에 포인터 변수 자체의 크기는 알 수 있다. 다만, 힙에 저장된 데이터의 크기는 런타임 시간에 알 수 밖에 없다.

댓글 없음:

댓글 쓰기

[Rust] Ownership, Scope, Transfer Ownership 과 Borrowing

Scope, Ownership, Transfer Rust에서 사용하는 영역, 소유, 소유권 이전, 복사, 빌림을 요약해 보는 것이 목적이다. 소유(Ownership)은 Java, Go와 같은 백그라운드에서 실행하는 garbage collector가 없...