일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 스위프트
- 파이썬
- Akka
- 파이썬 머신러닝
- 하이브리드앱
- CORDA
- 파이썬 데이터분석
- 스칼라
- akka 강좌
- Actor
- Golang
- 스칼라 동시성
- 하이퍼레저 패브릭
- 이더리움
- Play2 로 웹 개발
- 엔터프라이즈 블록체인
- 블록체인
- 안드로이드 웹뷰
- 파이썬 강좌
- 파이썬 동시성
- play2 강좌
- Play2
- 플레이프레임워크
- 스칼라 강좌
- Adapter 패턴
- Hyperledger fabric gossip protocol
- 그라파나
- play 강좌
- hyperledger fabric
- 주키퍼
- Today
- Total
HAMA 블로그
스마트 포인터 종류 분석 - C++98, 11, TR1, boost - 본문
안전한 C++ 라이프를 위한 스마트포인터에 대해 정리를 해봤습니다. (2012년 현재)
마지막 한줌의 속도라도 짜내야하는 그런 부분 제외하고는 웬만하면 C++ 말고 다른것을 사용하라고 조언드리고 싶고, Rust 의 빠른 발전을 기대합니다.
1. Scoped_ptr (boost)
0. 복사불가 단일 소유자
1. 한마디로 scoped_ptr 는 복사할 수 없는 auto_ptr 이다.
2. 젤 가볍습니다.
3. 제한적이다. (한 함수 내에서만 동적할당해서 쓰다가 함수를 끝낼 때는 삭제해야 하는 임시 객체를 처리할 때도 유용하게 쓰일 수 있습니다)
4. 이 스마트포인터를 포함하고있는 클래스도 복사불가입니다.
5. "자원 획득은 초기화 이다." 만을 위해 존재한다. 레퍼런스 카운팅이 없고, 소유권공유,이전문제도 없다.
6. 명확한 쓰임새를 위해서 비전에서 이것으로 교체하는게 좋을듯합니다.
7. STL 컬렉션과 함께 사용불가
2. Scoped_array (boost)
0. 동적으로 할당한 배열에 대해 사용
1. 복사불가 단일 소유자
2. 동적인 배열이 필요하다면 std::vector라는 훌륭한 대체 수단이 이미 존재하는 관계로,
이 scoped_array의 사용 목적은 주로 오래되고 복잡한 코드를 유지 보수하면서 혹시나 delete[]를 잊을 수도 있는 후임자를 위해 사용해라가 되겠습니다.
3. auto_ptr (C++98)
0. 복사가능 단일 소유자
1. 한마디로 복사할수있는 Scoped_ptr 입니다.
2. A->B 로 복사하고나서 A 가 소멸되면 B 스마트포인터는 빈곳을 가르킨다면 대략 낭패입니다.
3. 2번 문제를 해결하고자 auto_ptr에서는 소유권을 이전시켜버립니다. A 는 복사하는순간 쓸모없어지는것이지요.
4. 레퍼런스카운팅을 하지 않는다. (단지 소유권 이전으로 단일 소유자만 존재)
5. STL 컬렉션과 함께 사용불가
4. shared_ptr (C++TR)
: 0. 복사가능 공유소유자
: 1. 레퍼런스 카운팅을 통해 공유를한다. 가장 마지막 소유자가 제거될때까지 힙에 존재합니다.
: 2. STL 컬렉션과 함께 사용가능
: 3. 가장 무겁다.
: 4. Copy on write 는 아니다. 한쪽에서 값이 바뀌면 다 모든 소유자가 다 바뀜.
5. weak_ptr (boost)
: 0.weak_ptr 는 share_ptr 로 초기화 되어야 한다는 제약.(즉 이것은 share_ptr와 관련되어서만 사용해야함.)
: 1.weak_ptr은 객체의 생명주기에 영향을 주지 않는다. (레퍼런스 카운팅에 영향을 안준다는뜻)
: 2.enable_shared_from_this<>는 내부적으로 weak_ptr을 이용하여 this 포인터의 shared_ptr 전달 문제를 해결하고 있다.
: 3.보통 shared_ptr 의 circular reference 문제를 해결하기위해 사용된다.
6. unique_ptr (C++11)
: 0. auto_ptr와 shared_ptr 사이의 절충안
: 1. unique_ptr은 기본적으로 auto_ptr와 유사하게 소유권의 이전에 기반한 동작을 한다
: 2. 그러나 일반 복사 생성, 대입 연산이 아닌 C++11에서 새롭게 추가된 R-value reference를 이용한다는 것이다.
: 3. C++11에서 STL 컨테이너에서도 효율성을 위해 내부적인 복사 및 대입 동작은 전부 R-value reference를 이용하도록 바뀌었는데,
일반 복사 및 대입 연산자를 막아 버리는 대신 R-value reference를 이용한 복사 및 대입 연산자만 정의한다면 STL에서도 사용할 수 있는 auto_ptr가 생긴다는 것이 unique_ptr의 의미이다.
: 4. STL 컨테이너에서도 사용할 수 있다.
: 5. raw pointer에 비해 추가적인 오버헤드도 없는 스마트 포인터라 할 수 있다. 의미적인 뚜렷함과 안전한 사용을 위해 대부분의 암시적인 변환이 막혀 있고, 일반적인 대입 및 복사가 막혀있으므로
unique_ptr 끼리의 대입에는 std::move 함수를 명시적으로 사용해야 하는 등 코딩량이 다소 늘어난다는 불편함이 있으나, 안전하고 속도개선의 코딩을 위해서라면 이 정도는 충분히 감수할 만 하다.
'C++ (비공개)' 카테고리의 다른 글
C API 와 C++(STL) 호환에 관한 팁 (0) | 2019.03.24 |
---|---|
C++ 50 계명 - 이것만은 기억하자. (1) | 2019.03.19 |