· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Gcc Option Omit Frame Pointer

GccOptionOmitFramePointer입니다.

-fomit-frame-pointer


[http]The Free Online Dictionary of Computing에 따르면, frame pointer의 정의는 다음과 같습니다:

A pointer to the current activation record in an implementation of a block structured language.


'-fomit-frame-pointer' 옵션을 쓰면 frame pointer가 필요없는 함수들을 컴파일할 때, frame pointer를 생략합니다. 따라서 frame-pointer를 저장하고, 다시 불러오는 부분에 해당하는 기계어를 만들지 않기 때문에 약간의 성능 향상을 기대할 수 있습니다.

int global_int;

void
bar(int a, int b)
{
  global_int = a + b;
}

위 소스를 제가 가진 시스템에서 gcc로 컴파일하면 다음과 같은 어셈블러를 만들어 줍니다:

; **** void
; **** bar(int a, int b)
; **** {
        pushl   %ebp
        movl    %esp, %ebp
; ****   global_int = a + b
        movl    12(%ebp). %eax
        addl    8(%ebp), %eax
        movl    %eax, global_int
; **** }
        popl    %ebp
        ret

아래 소스는 똑같은 C 소스를 -fomit-frame-pointer 옵션을 써서 어셈블한 것입니다 (위의 어셈블 리스트와 비교해보시기 바랍니다):

; **** void
; **** bar(int a, int b)
; **** {
; ****   global_int = a + b
        movl    8(%esp). %eax
        addl    4(%esp), %eax
        movl    %eax, global_int
; **** }
        ret

즉, 첫 어셈블 리스트에서, 함수 첫 부분에서 pushl, movl 부분과 마지막 ret 위의 popl이 빠졌습니다. 또한 함수의 인자를 전달하는 부분에서 EBP 대신에 ESP register를 쓴 것을 볼 수 있습니다.


TODO: 좀 더 설명을 붙일 것. -- [http]신성국



ID
Password
Join
You enjoy the company of other people.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2005-04-05 23:51:52
Processing time 0.0061 sec