인라인 함수를 대한 궁금증

GjtRoql의 이미지

C++ 에서 인라인 함수는 C 프로그램의 매크로의 문제점을 보완하면서 매크로 처럼 작동하는 함수라고 알고 있습니다.

그리고 매크로는 전처리기에서 처리되고 인라인 함수는 컴파일시 처리된다는것도 알고 있습니다.
하지만 왜 인라인 함수를 재귀호출함수나 인라인 함수안에 loop나 switch 혹은 goto 문을 사용하면 않되는지를 이해하기 가 힘들군요

왜일까요.

freezm7의 이미지

GjtRoql wrote:
C++ 에서 인라인 함수는 C 프로그램의 매크로의 문제점을 보완하면서 매크로 처럼 작동하는 함수라고 알고 있습니다.

그리고 매크로는 전처리기에서 처리되고 인라인 함수는 컴파일시 처리된다는것도 알고 있습니다.
하지만 왜 인라인 함수를 재귀호출함수나 인라인 함수안에 loop나 switch 혹은 goto 문을 사용하면 않되는지를 이해하기 가 힘들군요

왜일까요.

제가 알고 있는대로만 답변드리겠습니다. (틀릴 수도 있다는 것이죠)

'사용하면 안된다' 는 부적절한 표현 같습니다.
다만 재귀호출 등을 사용하게 되면 인라인 함수가,
인라인 되지 않고 (즉 호출함수에 임베드 되지 않고)
주소를 가지는 독립함수가 될 것입니다.

왜냐하면 재귀호출을 위해서는,
함수 자신만의 스택프레임이 있어야 하는데, (그래야 로컬 변수를 저장할 곳이 있겠죠)
인라인 되어버리면 호출하는 함수의 스택 프레임내에 포함되게 되겠죠. (추측입니다)
무엇보다 결정적인 이유는 재귀호출할 대상 자체가 실재하지 않기 때문입니다.

loop, switch, goto 문에 대해서는 글쎄요. :?

즐겁게 살아 볼까나~*

utcman의 이미지

inline은 컴퍼일러에게 강제로 할수 있는 성격의 동작이 아닙니다. 심지어 force inline 성격의 키워드를 주더라도 컴파일러가 이에 대해 거부할 수 있습니다.
inline 키워드의 성격을 단순히 컴파일러에게 이 함수는 크기도 작고 많이 쓰이는 함수이니 잘좀 봐줘... -0- 정도의 의미로 이해하시는게 좋을것 같습니다.

VC.net 2003에서는 inline의 적용 예외가 재귀호출과 함수포인터와 연관된 경우로 정의하고 있군요. 물론 언급된 2가지 경우는 inline을 '항상 하지 않는' 경우이며 나머지의 경우에도 컴파일러의 판단에 의해 언제든지 inline 키워드는 무시될 수 있습니다.

MSDN 표현을 참조하면
"The inline keyword tells the compiler that inline expansion is preferred"
"you should not depend on the inline specifier to cause a function to be inlined"
정도를 보시면 될 것 같습니다.

utcman의 이미지

1) goto, switch 문 같은 경우는 inline 함수를 컴파일하는 시점에는 분기 주소를 알수 없고 실제 inline 함수가 확장되는 시점에야 판별이 가능하다는 문제점.

2) loop의 경우는 컴파일러 내부적으로 inline 에 대한 평가에서 이 함수는 loop를 포함할 정도의 크기가 큰 함수이므로 inline이 적절하지 않다고 판단하여 inline을 거부한 경우.

3) 재귀 함수의 경우는 freezm7님의 언급대로 인라인 함수에 대한 재귀호출 처리의 구현의 어려움 정도가

인라인 처리가 힘든 이유가 되겠네요...

그런데 요렇게 복잡한 함수라면 굳이 inline 키워드를 사용하지 않으시는게 더 좋으실거 같은데요 ^^;

GjtRoql의 이미지

감사합니다.
도움이 많이 되었습니다.

--------------
Burning Blue!
--------------

댓글 달기

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