C++ 에서 함수의 매개변수를 어떤 타입을 쓰는 것이 가장 좋을까요?

oruddk의 이미지

C++ 언어를 이용해서 프로그램을 만들고 있습니다.

각각의 함수의 매개변수를 어떤식으로 쓰는 것이 가장 프로그램을 최적화 시키는 방법인지 궁금합니다.

함수를 만들때 입력용 매개변수에는 포인터와 레퍼런스를 매개변수로 사용하는 방법 중에 어느것이 좋을까요?

또는 string 과 integer 같은 값을 함수의 매개변수로 사용할때 레퍼런스로 사용하는 방법과 변수를 이용하는 방법중 어느것이 프로그램을 더 효과적일지 궁금합니다. ^^

refill의 이미지


그때 그때 상황에 따라서 다르지요.

--------------------
생이 바람과 같고나..

바람과 같이

chadr의 이미지

포인터를 쓰든 레퍼런스를 쓰든 둘간의 성능차는 없습니다.

단순히 개인취향인데요.. 저같은 경우에는 입력용은 레퍼런스로..
출력용으로는 포인터를 사용합니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

philnet의 이미지

> 입력용 매개변수에는 포인터와 레퍼런스를 매개변수로 사용하는 방법 중에 어느것이 좋을까요

포인터와 레퍼런스 간의 성능 차이는 없겠지만, 포인터의 경우는 NULL 포인터가 넘어올 수 있으므로, 그에 대한 체크가 필요할 것이고요, 이에 비해 레퍼런스의 경우는 반드시 존재하는 개체가 넘어오게 되므로 바로 쓸 수 있는 차이가 있겠네요.

> string 과 integer 같은 값을 함수의 매개변수로 사용할때 레퍼런스로 사용하는 방법과 변수를 이용하는 방법중 어느것이 프로그램을 더 효과적일지 궁금합니다.
int 같은 built-in type 변수는 call by value로 넘기는 것과 포인터 및 레퍼런스로 넘기는 것이 별 차이가 없을 것이기 때문에 넘기는 인자의 원본이 변경되어야 하는 지의 여부를 가지고 int나 int*/int& 중 선택하면 될 것 같습니다. (포인터냐 레퍼런스냐는 위의 내용을 참고)

string의 경우는, 인자의 원본을 수정해야 하는 경우가 아니라면, const string& 로 넘기는 것이 불필요한 복사가 안 일어나면서, char* 까지 한번에 처리할 수 있으므로 좋을 것 같습니다. (물론 char* 포인터를 인자로 주고 호출하면 임시 객체가 생성될 것이므로, 이에 대한 성능 저하가 맘에 걸린다면 const char* 또는 char* 를 받는 함수도 오버로딩해서 제공하면 되겠지요)

(참고) 이런 내용은 Scott Meyers의 Effective C++/More Effective C++ 책에 잘 나와 있습니다.

chadr의 이미지

포인터와 레퍼런스 간의 성능 차이는 없겠지만, 포인터의 경우는 NULL 포인터가 넘어올 수 있으므로, 그에 대한 체크가 필요할 것이고요, 이에 비해 레퍼런스의 경우는 반드시 존재하는 개체가 넘어오게 되므로 바로 쓸 수 있는 차이가 있겠네요.

-> 꼭 그렇지는 않습니다..

int *p = NULL;
int &r = *p;
 
r = 1;//펑!

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

philnet의 이미지

그럴... 수도... 있네요... -.-;

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.