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.