C++에서, 펑터의 리턴 타입으로 pointer와 reference간 선택의 문제 좀 도와 주세요

parkon의 이미지

펑터라는 개념도 별로 없어 겨우 겨우 하는 수준인데요, 이 펑터의 리턴 타입에 대해서 궁금해서요.

제가 하려고 하는게,
어떤 클래스가 있고, 멤버 함수 중에서 functor를 리턴하는 녀석이 있습니다.

예를 들어

class F1 {
   double operator()(double);
   ...
}
 
class MyCLASS {
private:
   F1 *f1;
public:
   F1 *GetF1(int);
   ...
}
 
F1* MyCLASS::GetF1(int a) {
  ...
  f1=new F1;
  ...
  return f1;
}

그럼 메인 루틴은

{
   MyCLASS *a= new MyCLASS(...);
 
   ...
   F1 *f= a->GetF1(123);
 
   double x,y;
 
   x=3.2;
 
   y= (*f)(x);
   ...
}

뭐 대충 이런 식인데요,
여기에서 123은 펑터에 들어가는 적당한 파라미터이고, F1은 펑터 클래스이고요.

현재 위와 같이 작성해서 그럭 저럭 잘 돌아 가고 있습니다.
근데,
이렇게 구현된 녀석에서, MyCLASS::GetF1이, 펑터 포인터가 아닌 펑터 레퍼런스를 반환하도록 하는게 어떨까 하고
같이 일하는 사람에게 물었더니,

즉 저 위의 루틴을,

   F1 &f=a->GetF1(123);
 
   x=3.2;
   y=f(x);

이렇게 되도록요,

그 사람 왈 const reference 를 쓸거냐, non-const reference를 쓸거냐,
그 둘에 실행 속도에서 차이가 많이 난다...는 식의 답변을 받았는데,

const reference를 쓴다는 말이, 저 위의 식을

const F1 &f=a->GetF1(123);
...

이렇게 구현한다는 뜻일까나요 ?

아님, GetF1을

const F1& MyCLASS::GetF1(int a) {
  ...
  f1=new F1;
  ...
  return *f1;
}
이렇게 구현한다는 뜻일까요 ?

포인터를 반환하는 경우에 비해 non-const reference와 const reference를 반환하게 하는 경우의
실행 속도도 궁금하고요.

혹시 이런 내용에 대해 잘 설명된 웹 사이트 알려 주시면 고맙겠습니다.

bugiii의 이미지

Modern C++ Design 을 보시면 궁금해 하고 계신 것과 더 좀 생각해봐야 하는 문제에 대한 해답을 보실 수 있습니다.

parkon의 이미지

bugiii님, 답변 고맙습니다.
디자인 패턴은 공부해 본 적도 없고 책도 하나도 없는데
말씀하신 책 구해서 한번 읽어봐야 겠습니다.

yielding의 이미지

포인터를 리턴하는 것과 레퍼런스를 리턴하는 것에 속도의 차이가 없습니다.

레퍼런스는 포인터처럼 pointer arithmatic이 없고 단지 메모리의 상에 이미 할당된 객체의 별명(alias)이죠.
두 개의 가장 큰 차이는 포인터는 *(p + 0x1111) = x 이런 표현으로 편리하지만 자칫 잘못하면 프로세스를 죽여버릴 수 있는 강력함이 있는 반면, 레퍼런스는 이미 정상적으로 할당된 객체를 alias할 수 밖에 없으므로 제한되지만 안전하게 사용할 수 있고 코드 상으로도 깔끔한 표현이 가능하다는 장점이 있습니다.

다른 책에는 포인터와 레퍼런스를 톱과 손톱깎기로 비유하기도 합니다. 적절한 경우에 알아서 쓰라고..

Life rushes on, we are distracted

Life rushes on, we are distracted