값에 의한 전달보단 상수객체 참조자에 의한 전달 방식을 택하는 편이 대개 낫다.

Bogoomi·2022년 6월 13일
0

EffectiveC++

목록 보기
6/24

항목20

값에 의한 전달보단 상수객체 참조자에 의한 전달 방식을 택하는 편이 대개 낫다.

간단 요약

  • 값에 의한 호출은 생성자와 소멸자가 중복되어 실행된다. 그런 불필요한 생성자,소멸자 호출을 방지하는 방법은 상수객체 참조자에 의한 전달 방법이다!
  • 복사 효율을 높이자!
  • 복사 손실 문제에 노출되지 않도록 해야한다!

값에 의한 전달
함수로부터 객체를 전달 받거나, 함수에 객체를 전달할 때 값에 의한 전달 방식을 사용한다
함수 매개 변수는 실제 인자의 '사본'을 통해 초기화된다.
함수 호출 시, 함수가 반환한 값의 '사본'을 전달 받음

예시 코드

class Person{
public:
   Person();
   virtual ~Person();
private:
   std::string name;
   std::string address;
};

class Student: public Person{
public:
   Student();
   ~Student();
private:
   std::string schoolName;
   std::string schoolAddres;
};

bool validateStudent(Student s);
Student plato;
bool platoIsOk = validateStudent(plato);

plato 객체를 validateStudent(Student s);에 인자값으로 전달하였을 경우 코드 실행 과정
1. Person() 생성자 호출
2. Student() 생성자 호출
3. Person() 복사 생성자 호출
4. Student() 복사 생성자 호출
5. ~Student() 복사 소멸자 호출
6. ~Person() 복사 소멸자 호출
7. ~Student() 멸자 호출
8. ~Person() 소멸자 호출

총 1번의 생성자 호출, 2번의 소멸자 호출이 이뤄진다.
이렇게 값에 의한 참조는 중복적 생성자/소멸자 호출이 이뤄지기 때문에 비효율적일 수 있다.

상수객체에 대한 참조자로 전달
예시 코드

bool validateStudent(const Student& s);
  • 새로운 객체가 만들어지지 않는다.(생성자/소멸자 호출 X)
  • 복사손실 문제(slicing Problem) 해결
  • const를 사용하게 되어, 값이 변경되거나 하지않는다.

값에 의한 전달이 효과적일 경우(저비용으로 그냥 쓰자는 마인드)

  • 단순한 기본 자료형일 경우. ex) int, short..등등
    but 무조건 작진 않다.( 기본 제공 타입과 사용자 정의 타입을 아예 다르게 취급하는 컴파일러가 있다. 진짜는 레지스터에 들어가나, 사용자정의자료형은 안들어간다! 의 차이점이 있다.. 사용자 정의 타입은 구현환경에 따라 얼마든지 커질 수 있다 )
  • STL 반복자(iterator)와 함수 객체(간단한)의 경우





잊지말자!

  • 값에 의한 전달 보다는 상수 객체 참조자에 의한 전들을 선호합시다. 대체적으로 효율적일 뿐만 아니라 복사손실 문제까지 막아줍니다.
  • 이번 항복에서 다룬 법칙은 기본제공 타입 및 STL 반복자, 그리고 함수 객체 타입에는 맞지 않습니다. 이들에 대해서는 '값에 의한 전달'이 더 적절합니다.
profile
개에에에바알

0개의 댓글