일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 암시적 변환
- implicit conversion
- more effective c++
- iterator
- lua
- Smart Pointer
- 게임
- effective stl
- c++
- 영화
- 반복자
- 언리얼
- 참조자
- reference
- 스마트 포인터
- operator new
- virtual function
- resource management class
- UE4
- 오블완
- universal reference
- 티스토리챌린지
- 상속
- Effective c++
- 예외
- std::async
- 보편 참조
- 영화 리뷰
- exception
- effective modern c++
Archives
- Today
- Total
스토리텔링 개발자
[Effective STL] 3. 컨테이너 요소 복사 본문
728x90
항목 3. 복사(Copy)는 컨테이너 안의 객체에 맞게 비용을 최소화하며, 동작은 정확하게 하자
컨테이너의 요소
- 기본적으로 STL 컨테이너는 삽입, 삭제 시 복사 처리를 한다.
- 컨테이너가 가진 객체는 넣을 당시의 것과 같은 것이 아니다.
- 컨테이너에서 객체를 가져와도, 컨테이너에 있었던 것이 아니다.
- 컨테이너 내부의 객체조차도 늘 같은 것이라 보장할 수 없다.
컨테이너 요소 복사
- 요소 객체의 복사 기능을 사용한다.
- 즉, 복사 생성자, 복사 대입 연산자를 사용한다.
class Widget
{
public:
Widget(const Widget&); // 복사 생성자
Widget& operator=(const Widget&); // 복사 대입 연산자
...
};
STL 복사로 인한 문제들
- 복사에 드는 비용이 큰 객체를 컨테이너에 넣는다면
- 수행 성능의 병목현상을 일으킬 수 있다.
- 커스텀 객체의 복사 동작이 단순히 복사 뿐 아니라 다양한 기능을 포함한다면
- 사이드 이펙트 문제도 있을 수 있다.(항목 8 참조)
- 상속된 객체를 컨테이너에 넣으려 한다면
복사를 고려한 STL 사용법
- 객체에 대한 컨테이너가 아니라 포인터에 대한 컨테이너를 사용하도록 하자.
- 포인터의 장점
- 속도가 빠르다.
- 복사 시 정확히 동작한다.
- 슬라이스 문제가 발생하지 않는다.
- 포인터의 단점
STL은 불필요한 복사 생성을 피하도록 설계되어 있다.
- 기본 배열과 vector의 비교
Widget w[maxNumWidgets]; // 기본 배열
// maxNumWidgets 개의 배열 공간을 미리 할당해둔다.
// 즉, 선언과 동시에 기본 Widget 객체들이 maxNumWidgets개 생성된다.
vector<Widget> vw; // vector
// 지금 당장은 Widget 객체를 하나도 가지지 않는다.
// 필요할 때 메모리 공간이 자라난다.
// 필요하다면 공간을 예약할 수 있지만..
vw.reserve(maxNumWidgets); // 항목 14 참조
// 생성자가 불리진 않는다.
- 즉, 복사를 많이 하긴 하지만, 기본 배열보다는 훨씬 효율적이다.
728x90
'Effective C++ > Effective STL' 카테고리의 다른 글
[Effective STL] 6. 컴파일러의 분석 오류 (0) | 2024.11.08 |
---|---|
[Effective STL] 5. 범위 멤버 함수(Range Member Function) (0) | 2024.11.07 |
[Effective STL] 4. 빈 컨테이너인지 확인하기 (0) | 2024.11.04 |
[Effective STL] 2. 컨테이너 독립성(Container-Independent) (2) | 2024.10.30 |
[Effective STL] 1. 컨테이너(Container) (0) | 2024.10.29 |
Comments