· 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]신성국





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.0043 sec