Effect C++ / 항목20. 값에 의한 전달보다는 상수객체 참조자에 의한 전달이 나음
한참 전에 봤던건데 다시 볼 필요가 있을 것 같아서 정리.
함수로 객체를 넘길때 그냥... 뭐, int, char 같은거면 괜찮은데 사용자 정의 타입의 객체를 넘길때는 비용이 좀 든다. 그리고 상속관계에 있는 객체를 넘길경우는 때에 따라서 위험할 때도 있음. 그러니까 이럴 경우
struct A {int len, char data[1024], int flag , . . . }
void printA {A _a}
{
. . .
}
>> 넘긴 객체와 별개로, printA 함수 내에서 새로 매개변수의 A객체가 생성되고(생성자 호출), 이 함수가 끝날때 A객체가 소멸되고(소멸자 호출)... A객체가 기본제공 타입만으로 이루어진 객체이기 때문에 이 비용이 적어 보이지만 만약 다른 사용자 정의 타입의 객체를 멤버변수로 갖고 있는 객체라면 이 생성자~소멸자 호출 페어는 사용자 정의 타입이 있는 만큼 호출됨. 따라서 상수객체 참조자를 쓸 때와는 달리 쓸데없이 생성자/소멸자 호출이 발생하게 됨.
게다가 만약 저 A 객체를 상속받는 B 객체가 저 함수에 매개변수로 들어갈 경우, 이 B 객체는 저 매개변수로 복사되는 순간 이미 B객체가 아니라 걍 A객체가 되버림. 뒤가 싹둑 잘려버림. 따라서 B에 오버라이딩 한 함수가 있다면 이미 A객체가 되어버렸기 때문에 영원히 B의 함수가 호출되지 않겠지. 이게 복사손실 문제라고 하는데
상수객체 참조자를 사용하면 이런 문제들을 떨쳐버릴 수 있음.
물론 어디까지나 사용자 정의 타입에 대한 문제. 기본 타입은 value든 ref든 관계없음.
+ 추가
C++11 에서 auto 사용시 이 부분을 고려해주어야 함.
auto test = _a;
위처럼 바로 넘겨주면 얘기했던 것과 같이 임시객체가 생성되기 때문에...
const auto& test = _a;
이게 효율적인 사용법.
'스터디' 카테고리의 다른 글
이것저것 (0) | 2017.04.01 |
---|---|
[아홉가지 알고리즘] 07. 데이터 압축 - 무손실 (0) | 2014.09.13 |
[아홉가지 알고리즘] 05. 오류 정정코드 - 핀포인트 트릭 (0) | 2014.07.31 |
[아홉가지 알고리즘] 05. 오류 정정코드 (0) | 2014.07.30 |
14 07 29 - 처리 흐름 제어 (0) | 2014.07.29 |