[Effective Modern C++] 2015 스콧 마이어스 저
" C++11 과 C++ 14 를 효과적으로 사용하는 42가지 방법
8장 다듬기
항목 41 이동이 저렴하고 항상 복사되는 복사 가능 매개변수에 대해서는 값 전달을 고려하라
효율성으로는 보편 참조 > 왼값 참조 + 오른 값 참조(오버 로딩) > 값 전달으로 볼 수 있다.
하지만 이동이 저렴하고 항상 복사되는 복사 가능 매개변수에 대해서는 값 전달을 고려하라
단, 값 전달의 경우 잘림 문제가 있을 수 있다. (메모리가 부족할 경우 모두 복사되지 않는 현상 int -> short)
*
왼값 인수의 경우 값 전달 다음의 이동 배정은 참조 전달 다음의 복사 배정보다 훨씬 비쌀 가능성이 있다.
값 전달에서는 잘림 문제가 발생할 수 있으므로, 일반적으로 기반 클래스 매개변수 형식에 대해서는 값 전달이 적합하지 않다.
항목 42 삽입 대신 생성 삽입을 고려하라
생성 삽입 (ex) emplace_back):
임시 객체의 생성과 소멸이 일어나지 않고 완벽 전달된다.
일반 삽입 (ex) push_back):
인수의 형식과 템플릿 형식이 같을 경우 : 생성 삽입 < 일반 삽입
임시 객체의 생성과 소멸이 일어나지 않아 일반 삽입과 다름 없어진다.
메모리 누수(안정성) : 생성 삽입 < 일반 삽입
완벽 전달이기 때문에 자원관리 객체 생성이 컨테이너 메모리 안에서 그것을 생성하는 시점까지 지연된다. 그 시점까지 예외가 발생하면 자원 누수가 일어날 수 있다.
복사 생성자 사용
std::vector<std::string> str;
str.emplace_back(nullptr); // 생성 삽입 : 복사 생성자 호출, 정상 동작
str.push_back(nullptr); // 일반 삽입 : explicit(형변환 검사), 컴파일 에러
'Programming' 카테고리의 다른 글
이펙티브 STL_2 (0) | 2021.02.07 |
---|---|
이펙티브 STL_1 (0) | 2021.01.31 |
이펙티브 모던 C++_7 (0) | 2020.12.13 |
이펙티브 모던 C++_6 (0) | 2020.12.06 |
이펙티브 모던 C++_5 (0) | 2020.11.29 |