inline으로 정의된 함수를 호출 했는데, inline이 되지 않습니다.

r4bb1t의 이미지

/* test.c 소스 파일 */
static inline void func1( int a )
{
int i = 100;
i = a + i + 1;
return ;
}

int main( void )
{
func1(3);
}

/* gcc -S test.c로 생성시킨 어셈 파일 */
.file "test.c"
.text
.globl main
.type main,@function
main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
subl $12, %esp
pushl $3
call func1
addl $16, %esp
leave
ret
.Lfe1:
.size main,.Lfe1-main
.type func1,@function
func1:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl $100, -4(%ebp)
movl -4(%ebp), %eax
addl 8(%ebp), %eax
incl %eax
movl %eax, -4(%ebp)
leave
ret
.Lfe2:
.size func1,.Lfe2-func1
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
~
~
어셈블한 test.s를 보면 func1 함수를 call을 하여 호출합니다.
제 생각에는 inline으로 함수를 정의하였으니 call한 위치에 해당 코드가 들어갈 것이라고 생각하는데요.

왜 인라인이 되지않은건지...

도움 부탁 드립니다.

sephiron의 이미지

만약, 함수가 inline으로 선언되어 있다고 하더라도 그 함수의 코드 블럭이
크다면 컴파일러는 인라인을 확장하지 않고 일반함수로 취급한다.

link
----
Forensic Computing On Linux

아직 멀었어

익명사용자의 이미지

gcc -S -O test.c

r4bb1t의 이미지

call 하는 함수를 단순히 return만 하게 만들어도 함수의 코드가 삽입되는게 아니라 call을 통해 함수를 호출 하네요..-.-;;;

절대노력집중인내 | SSM(OS)

절대노력집중인내 | SSM(OS)

익명사용자의 이미지

inline 키워드에는 강제의 의무가 없습니다. 해도 되고 안해도 되고... 강제하고 싶다면 각각의 컴파일러에서 제공하는 좀 더 확실한 방법을 사용하세요.
http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Inline.html#Inline
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_pluslang_inline_specifier.asp

r4bb1t의 이미지

절대노력집중인내 | SSM(OS)

절대노력집중인내 | SSM(OS)

chadr의 이미지

위의 익명분께서 답해주신대로 inline은 컴파일러에게 강제를 하지 않습니다.
단지 프로그래머가 컴파일러에게 "이건 간단하니까 인라인을 하면더 성능이 나아지지 않을까?" 라고 힌트를 주는것 뿐입니다.

그렇기 때문에 컴파일러가 최적화시 판단하여 해당코드를 인라인하는게 더 나쁜 성능을 가지거나 인라인이 불가능한 구조인경우에는 인라인을하지 않습니다.
-------------------------------------------------------------------------------
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.

댓글 달기

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