Post List

2015년 1월 4일 일요일

'Call by Value' 보다는 'Call by Constant Reference' 방식을 택하는 편이 대개 낫다.

* Call by Value 보다는 Call by Constant Reference를 선호합시다. 대체적으로 효율적일뿐만 아니라 복사손실 문제까지 막아 줍니다.

bool validate(const Student& s);

Call by Value의 경우 각 개체 및 멤버들에 대해서도 생성자 및 소멸자가 호출되어야 하므로 고비용 연산이 된다.

그리고 복사손실문제(Slicing Problem)이 발생할 수도 있다. 함수의 Parameter가 부모 Class의 Type으로 선언되어 있고, 상속받은 자식 Class의 개체를 전달하면 부모 Class의 내용을 제외한 나머지 내용은 다 잘려져서 전달된다.

* 기본제공 Type, STL 반복자, 함수 객체 Type에는 Call by Value가 더 적절합니다. 

 Reference는 보통 Pointer를 써서 구현된다. 그러므로 Pointer보다 간단한 값은 Call by Value가 더 적합하다. 그런데 단순 크기만으로 구분하는 것은 위험하다. 예를 들어서 double 은 Register에 들어가지만 double형 하나만을 포함한 Class의 경우에는 Compiler에 따라 Register에 들어가지 않을 수도 있다. 그리고 달랑 Pointer 하나뿐인 개체가 꽤 많이 널려 있긴 하지만, 이런 개체를 복사하는데는 그 Pointer 가 가리키는 대상까지 복사하는 작업도 따라다녀야 한다. 더군다나 사용자가 정의한 Class라면 지금은 크기가 작아도, 언제 누가 멤버들을 추가해서 크기가 커질지 모른다.



댓글 없음:

댓글 쓰기