Gcc Option Omit Frame Pointer
GccOptionOmitFramePointer입니다.
-fomit-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: 좀 더 설명을 붙일 것. --
![]() |