inline으로 정의된 함수를 호출 했는데, inline이 되지 않습니다.
/* 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한 위치에 해당 코드가 들어갈 것이라고 생각하는데요.
왜 인라인이 되지않은건지...
도움 부탁 드립니다.
만약, 함수가
만약, 함수가 inline으로 선언되어 있다고 하더라도 그 함수의 코드 블럭이
크다면 컴파일러는 인라인을 확장하지 않고 일반함수로 취급한다.
link
----
Forensic Computing On Linux
아직 멀었어
gcc -S -O test.c
gcc -S -O test.c
만약 함수의 코드 블럭이 크다면...
call 하는 함수를 단순히 return만 하게 만들어도 함수의 코드가 삽입되는게 아니라 call을 통해 함수를 호출 하네요..-.-;;;
절대노력집중인내 | SSM(OS)
절대노력집중인내 | SSM(OS)
inline 키워드에는
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
아 ..그렇군요..답변 감사 합니다...
절대노력집중인내 | SSM(OS)
절대노력집중인내 | SSM(OS)
위의 익명분께서
위의 익명분께서 답해주신대로 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.
댓글 달기