c++메쏘드 정의와 선언

korisaram의 이미지

c++에서 메쏘드 선언할때 class 안에서도 가능하고 밖에서도 가능한데요.

class in_method{
    void hello(){
        cout<<"hello";}
};

class out_method{
    void hello();
};
         
void out_method::hello(){
       cout<<"hello";
}

예전에 본 책에서 시간이 많이 걸리거나 내용이 길다면 밖에 선언하는게 좋다고 본 기억이 납니다.
근데 class의 안과 밖에서 선언하는게 효율이랑 속도에 영향을 많이 미치나요?

두개가 큰 차이 없다면 class안에서 다 선언하고 싶거든요. 그게 보기에도 이뿌고 편한거 같아서요.

pok의 이미지

클래스 안에서 함수의 본체를 작성하면 일단은 인라인 함수로 인식하지만 덩치가 클 경우에는 알아서 인라인 함수에서 제외됩니다.

요는 실행속도에서는 큰 차이 없다는 것입니다.

다만 이 클래스를 다른 소스파일에서 참조할 경우 c++에서는 include를 쓰는데, 이것이 무식하게 파일을 그대로 읽어들이는 것입니다. 그래서 만일 함수를 클래스 안(좀더 정확히 말하면 클래스와 같은 파일안)에서 작성한다면 컴파일 시간이 꽤나 길어질 수 있습니다.

익명 사용자의 이미지

Quote:
그래서 만일 함수를 클래스 안(좀더 정확히 말하면 클래스와 같은 파일안)에서 작성한다면 컴파일 시간이 꽤나 길어질 수 있습니다.

그러면 컴파일 시간만 많이 걸리고 실행화일을 만들어서 실행시키는데는 영향을 미치는게 아닌거죠?
취미로 배우는데 컴파일 시간에만 영향을 미친다면 class안에서만 해야겠습니다.

IDNed의 이미지

한가지 단점은 있겠네요...

만일 짧은 함수라도 인라인하기 싫은(?) 함수가 있을 때 그걸 직접 설정 못하는거...

ssehoony의 이미지

위에 있는 내용 처럼
클래스 선언에서 멤버함수를 구현하면 인라인이 되는게 맞습니다.

여기서 고려해야 할 것들이 있습니다.
1. 무조건 inline 좋은가?
2. inline 키워드로 만든 멤버함수랑은 어떻게 차이가 있나?

inline 함수가 항상 일반 함수보다 항상 빠른건 아닙니다.
inline 할려고 하는 함수의 인스트럭션 코드가 크면 CPU의 1차 캐쉬중 인스트럭션 캐쉬 히트률을 떨어 뜨릴 수 있습니다.
캐쉬 히트률 저하는 함수 콜링에 대한 부하 보다 더 비효율적 입니다.
보통 컴파일러가 스스로 판단하여 함수가 좀 크거나 함수 내에 분기문이 들어가 있으면 대부분 인라인으로 확장하는 명령을 무시합니다.
(gcc 의 경우 -Winline 옵션으로 inline 확장이 불가능할 경우 경고문구를 볼 수 있습니다. MSC 에서는 __force_inline 인가(??) 하는 키워드로 무조건 확장하도록 지시할 수 있습니다.)

inline 키워드를 줘서 하면 되지, 클래스 선언에서 멤버함수를 구현할 필요가 있나?
inline 키워드를 이용해 만든 함수나 클래스 멤버함수는 같은 소스파일 내에서만 inline 으로 확장이 됩니다.
즉, inline 확장을 위해서는 컴파일 타임때 inline 함수의 구현소스가 있어야 한다는 것이지요.
하지만, 클래서 선언부에 메소드를 구현해서 헤더파일에 넣어 놓으면, 다른 파일을 컴파일 하더라도 inline 확장이 가능합니다. (헤더파일에 inline 확장할 메소드의 구현소스가 존재하기 때문에 가능하지요.)

최근 MSC 같은 경우는 Whole Program Optimization 이라는 옵션을 통해 타 소스 파일에 있는 inline 함수도 확장이 가능하도록 하는 옵션이 있습니다. (물론, 컴파일은 더 느려지죠. 정확히 말하면 링크 타임이 길어집니다.)

댓글 달기

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