C++에서, 펑터의 리턴 타입으로 pointer와 reference간 선택의 문제 좀 도와 주세요
글쓴이: parkon / 작성시간: 수, 2009/12/16 - 7:25오후
펑터라는 개념도 별로 없어 겨우 겨우 하는 수준인데요, 이 펑터의 리턴 타입에 대해서 궁금해서요.
제가 하려고 하는게,
어떤 클래스가 있고, 멤버 함수 중에서 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를 반환하게 하는 경우의
실행 속도도 궁금하고요.
혹시 이런 내용에 대해 잘 설명된 웹 사이트 알려 주시면 고맙겠습니다.
Forums:
Modern C++ Design 을
Modern C++ Design 을 보시면 궁금해 하고 계신 것과 더 좀 생각해봐야 하는 문제에 대한 해답을 보실 수 있습니다.
bugiii님, 답변
bugiii님, 답변 고맙습니다.
디자인 패턴은 공부해 본 적도 없고 책도 하나도 없는데
말씀하신 책 구해서 한번 읽어봐야 겠습니다.
포인터와 레퍼런스의 차이에 대한 이해
포인터를 리턴하는 것과 레퍼런스를 리턴하는 것에 속도의 차이가 없습니다.
레퍼런스는 포인터처럼 pointer arithmatic이 없고 단지 메모리의 상에 이미 할당된 객체의 별명(alias)이죠.
두 개의 가장 큰 차이는 포인터는 *(p + 0x1111) = x 이런 표현으로 편리하지만 자칫 잘못하면 프로세스를 죽여버릴 수 있는 강력함이 있는 반면, 레퍼런스는 이미 정상적으로 할당된 객체를 alias할 수 밖에 없으므로 제한되지만 안전하게 사용할 수 있고 코드 상으로도 깔끔한 표현이 가능하다는 장점이 있습니다.
다른 책에는 포인터와 레퍼런스를 톱과 손톱깎기로 비유하기도 합니다. 적절한 경우에 알아서 쓰라고..
Life rushes on, we are distracted
Life rushes on, we are distracted
댓글 달기