· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Gcc Option Force Mem

GccOptionForceMem입니다.

-fforce-mem


사칙연산(덧셈, 뺄셈, 곱셈, 나눗셈)을 하기 전에, 메모리 operand를 먼저 register로 불러옵니다. 아시다시피, 메모리에서 값을 읽는 것은 레지스터에서 읽는 것보다 느립니다. 연산을 수행하기 전에, 메모리에 저장되어 있는 값을 레지스터로 불러와서 작업을 수행하기 때문에, 메모리에 있는 값에 많은 연산을 할 경우, 이 옵션을 쓰면 속도 향상을 기대할 수 있습니다:

int global_int;

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

위 소스를 x86 시스템에서 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 소스를 -fforce-mem 옵션을 써서 어셈블한 것입니다 (위의 어셈블 리스트와 비교해보시기 바랍니다. 특히 덧셈을 수행하는 부분인 'addl' 명령 부분을 잘 보기 바랍니다):

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

-fforce-mem 옵션을 쓴 경우, EBP가 가리키는 메모리에 직접 더하는 방식을 쓰지 않고, 일단 먼저 메모리에 있는 값인 8(%ebp)를 EAX 레지스터에 불러온 다음에 덧셈을 하는 것을 알 수 있습니다.



ID
Password
Join
Like winter snow on summer lawn, time past is time gone.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

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