[완료]C++ 기초 문법 질문 임돠

jeongheumjo의 이미지

너무 초보적인 질문이라 챙피합니다만,
잠시 챙피함을 무릅쓰고 궁금한 것 여쭙습니다.

클래스를 구현할 때 보통 .h 와 .cpp 파일로 나누어서 코딩한다고 C++ 책에서 읽은 것 같은데요,
헤드퍼스트 디자인패턴 책에서 보면 클래스 구현을 모두 .h 파일에 넣었더라구요..
이렇게 하면 클래스를 가져다 쓰기가 참 쉬워서 좋더라구요..
저도 그렇게 하고 있는데, 회사 사람 한명이 그렇게 하면 모든 클래스의 맴버 함수들이 인라인으로 빌드되는 것이라고 하네요...
제가 책을 다시 찾아봐도 인라인으로 사용하기 위해서는 inline 이라고 명시적으로 선언해주어야 하는 것으로 알고 있거든요..

클래스 구현을 .cpp 파일을 사용치 않고 모두 .h 파일에 하면 모든 맴버 함수가 인라인 함수가 되나요?

감사합니다.

bootmeta의 이미지

http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.8

class 선언 body 내에 있으면 inline memeber function 정의로 간주됩니다.

만일 inline이 되지 않았다고 가정한다면 문제가 발생하죠.
예를 들어 x.a() member function이 정의된 x.hpp를 y.cpp, z.cpp가 include하는 경우,
x.a()가 중복 정의되죠.
이와 달리 inline이라면 해당 함수 호출은 바로 치환되므로 중복 정의와 무관.

ps 1)

참고로 class 선언 body 바깥에 inline keyword로 member function 정의를 했다면, 해당 inine member function도 header파일에 포함해야합니다.
cpp에 포함하면 해당 파일 내에서만 치환가능하고, 다른 cpp에서 호출하면 unresolved external
http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.7

ps 2)
위 이야기는 표준적인 이야기고, 실제 compiler 마다 약간씩 차이(?)가 날 수도 있습니다.

gilgil의 이미지

Release 모드로 컴파일하는 경우 inline으로 해야 할지, 아니면 stack을 이용한 함수 call을 사용할 것인지를 컴파일러가 알아서 결정을 합니다.
Visual Studio의 경우에는 Profile Guided Optimization 설정하는 부분이 있구요, GCC 계열은 잘 모르겠군요.

inline으로 하면 당연히 call stack을 이용한 parameter의 cost는 줄일 수 있겠지만,
실제 대형 프로젝트에서는 header file 코드 한줄만 수정해도 전체가 rebuild되는 경우가 많이 때문에,
cimpile time에 허송 세월을 보내는 경우가 많습니다(한줄 고치고 커피 한잔 하고 오고...).

결국 나중에 가서는 header file에 코드를 넣은 것을 지양하게 되더라구요.

jeongheumjo의 이미지

좋은 래퍼런스 알려주신 붓매타님, 비주얼스튜디오 옵션 알려주신 길길님 감사합니다. ^^;

댓글 달기

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