일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- column space
- 다익스트라
- 코드포스
- 스레드전용저장소
- 대상파일
- eigenvalue
- 벡터
- 구문트리
- matrix
- 알고리즘
- linear algebra
- 정처기 실기 벼락치기
- 정보처리기사 실기 벼락치기
- vector
- 재배치
- 링커
- rust 스터디
- 컴파일러
- 백준
- 선형대수학
- 다이나믹 프로그래밍
- 정처기 실기 공부법
- Rust
- 정처기 공부법
- 행렬
- 정보처리기사 2025 1회 실기 벼락치기
- 컴퓨터밑바닥의비밀
- unity
- CS정리
- c++
- Today
- Total
개발_기록용
RUST 스터디[RUST vs C++] 20. Smart Pointers 본문
https://google.github.io/comprehensive-rust/smart-pointers.html
Smart Pointers - Comprehensive Rust 🦀
This segment should take about 55 minutes. It contains: SlideDuration Box10 minutes Rc5 minutes Owned Trait Objects10 minutes Exercise: Binary Tree30 minutes
google.github.io
Rust에도 스마트 포인터라는게 존재한다. Box, Rc, Trait Object를 배운다!
20.1 Box<T>
C++에서 스마트 포인터 중 하나인 unique ptr와 똑같다.
어떤 heap에 있는 데이터를 가리키는 데이터 타입!

우선, Box로 5라는 값을 하나 만들면
5는 Heap에 만들어지고, 이를 가리키는 five는 Stack에 만들어진다.
그럼 이 Box는 왜 만들어졌을까?

위의 예제는 리스트를 만드는 예제.
우리가 구조체를 만들던지, 열거체를 만들던지 데이터 타입이 몇 바이트인지는 파악을 해야 한다.
List<T>의 크기가 몇 바이트인지 모르니까 만든게 Box.
일단 몇 바이트인지는 몰라도, 이걸 Box로 포장하면 몇 바이트인지는 모르지만 포인터를 갖게 되고,
우리가 이 포인터의 크기는 아니까 이걸 heap에 보내놓는 용도로 쓴다. 그래서 생각보다 쓸 일이 많다.
*Nil은 끝을 처리하고 싶을 때 쓰는 것으로 그냥 빈 것.
20.2 Rc
Rc는 Reference Counting의 약자! Rust는 길게 쓰는거 싫어한다.
C++의 shared ptr와 같다.

a는 내부적으로 reference count가 1이고, b는 clone한 거니까 reference count가 2이다.
그리고 이 함수가 끝나면, b가 먼저 호출되었으니 사라지면서 reference count가 1이 되고,
그 후 a가 사라지면서 reference count가 0이 되어 메모리에서 해제된다.
위처럼, 값을 참조해서 읽고 싶을 땐, Rc 타입으로 만들면 된다.
*참고로, Rc는 읽기 전용이다. (Arc도 읽기 전용.)
근데, 읽기 전용이라면 반쪽 자리이지 않을까? 그래서 쓰기 가능한 Rc가 뒤에 나온다.
20.3 Trait Objects

위처럼 pets에서 Pet을 상속받는 Dog와 Cat을 원소로 갖는데,
문제는 Dog와 Cat이 얼마나 올지 모르니 이 pets 입장에서 사이즈를 알 수 없다.

=> 이럴 때, Box를 쓴다. 이렇게 써서 다형성을 보장.
'RUST 스터디' 카테고리의 다른 글
RUST 스터디[RUST vs C++] 22. Borrowing (0) | 2024.06.18 |
---|---|
RUST 스터디[RUST vs C++] 19. Memory Management (1) | 2024.06.18 |
RUST 스터디[RUST vs C++] 13. Methods and Traits (1) | 2024.05.15 |
RUST 스터디[RUST vs C++] 12. Pattern Matching (0) | 2024.05.13 |
RUST 스터디[RUST vs C++] 10. User-Defined Types (0) | 2024.05.13 |