본문 바로가기

Programming

이펙티브 모던 C++_8

[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