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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.