inline 와 template 선언 위치..

ssehoony의 이미지

inline 키워드의 경우 헤더파일과 소스파일에 사용할 수가 있는데
만약 헤더 파일에서, 함수 선언 파일 앞에 inline 를 붙였는데
소스파일의 정의 부분에서는 inline 를 붙이지 않는 다면 어떻게 되나요?
인라인함수로 간주가 되는건지 아닌건지 궁금하네요.

반대로 헤더에는 넣지 않고 소스파일에만 넣는다면 어떻게 되나요?
왠지 헤더파일을 따라 갈 것 같은데 어떻게 되는지 궁금하네요.

template 같은 경우는 어떻게 되나요?

그리고 함수 call 의 부하를 줄이기 위해 inline 을 사용한다고 하는데
함수 call 을 위해 어셈차원에서 몇개의 레지스터를 push/pop 하는게
그렇게 부하가 심한 일인가요? 아니면 그것 말고 다른 작업도 있는건가요?

dudungsil의 이미지

말씀하신대로 직접 해보시면 한방에 알수 있을것 같은데요.

산넘어 산

ssehoony의 이미지

템플릿이야 compile 에서 에러를 낼 법도 한데
inline 같은 경우는 inline 함수로 만들 수 없을 경우 비inline 함수로
컴파일을 해버립니다. 특별히 에러문구를 컴파일에서 내주지 않습니다.
그래서 선언적인 문제로 inline 된건지 안된건지 알 수가 없네요.

Testors의 이미지

어떤 경우를 생각하시는지 모르겠지만 참고로 아래의 경우는 인라인이 될 수 없습니다.


== a.h ==

inline int a();



== a.c ==

int a()
{
    return 3;
}



== main.c ==

#include "a.h"

int main()
{
    a();    <--- (1)
}

int b()
{
    return 4;
}

이것은 a.c 파일의 함수 앞에 inline 키워드를 추가해도 마찬가지 입니다.

이유를 설명하자면..

가령 컴파일러가 main.c 를 컴파일 한다고 해보지요.

그럼 (1) 의 시점에서 a() 의 본체를 알고 있어야만 인라인으로 넣던가 말던가 하겠지요?

a() 의 본체를 알려면 어떻게 해야 할까요? a.o 를 뒤져야 할까요?

하지만 항상 a.c 가 먼저 컴파일 된다는 보장이 있을까요?

강제적으로 a.c 를 먼저 컴파일 되게 한다.. 라는 방법이 있을수도 있겠지요.

하지만 만약 a.c 에서는 main.c 에 있는 b() 를 인라인 하고싶어한다면...?

문제가 많지요..? ^^

정리하자면,

이미 함수의 본체에 대한 정보를 컴파일러가 이미 알고있는 경우가 아니라면

인라인 함수로 동작하기가 힘들다.. 라고 보시면 됩니다.

인라인 함수를 사용 하기전에 인라인 함수 본체를 그 위에 놓으셔야 합니다.

그것이 헤더이던 소스파일이던 말이지요.

( 좋은 컴파일러는 같은 파일 내에 있다면 본체가 뒤에 있어도 연결해 주긴 합니다만.. )

참고로 인라인 되었는지 안되었는지 여부는 디스어셈블 해서 call 이 일어나는지를 검사해보면 알 수 있겠지요.

댓글 달기

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