Rust · Box<T>

Box는 소유권을 유지한 채 한 단계 간접으로 문제를 푼다

값은 힙에 두고 스택에는 고정 크기 포인터를 두면, 큰 값 이동과 재귀 타입의 크기 계산 문제를 같은 원리로 다룰 수 있습니다.

recursive

크기를 알 수 없는 타입

List가 직접 List를 담으면 무한 크기입니다. Box<List>는 포인터 크기로 재귀를 끊습니다.

move

큰 데이터 이동

소유권을 옮길 때 실제 값 전체가 아니라 힙 주소를 담은 작은 핸들만 이동합니다.

trait object

구체 타입 감추기

값을 소유하되 구체 타입보다 특정 트레이트 구현 여부만 중요할 때 트레이트 객체와 함께 쓰입니다.

1

직접 포함

Cons(i32, List)

컴파일러가 다음 List의 크기를 다시 묻습니다.

2

무한 전개

i32 + List + ...

배리언트 크기가 끝나지 않아 E0072가 납니다.

3

Box 삽입

Cons(i32, Box<List>)

다음 값은 힙에 있고 현재 값은 포인터만 갖습니다.

4

크기 확정

i32 + pointer

모든 Cons가 같은 고정 크기로 표현됩니다.

남는 제약

Box<T>는 단일 소유자 모델입니다. 여러 소유자가 필요하면 Rc<T>, 불변 값 내부 변경이 필요하면 RefCell<T>를 검토합니다.