자동 변수, 전역 변수, 레지스터 변수, 정적 변수, 휘발성 변수 |
▶ 오른쪽 - 최적화 안한 소스 ( gcc -O -o 출력파일이름 출력파일이름.c ) ▶ 왼쪽 - 최적화 소스 ( gcc -o 출력파일이름 출력파일이름.c ) 예를들어서, ARM 에서 레지스터 ADC 의 값을 계속 찍어 내려고 printf를 연속으로 쓰면 gcc에서는 warning이 뜬다. 센서 값은 계속 변하는 값이기 때문에 변수 하나를 선언하고 변수에 센서값을 넣은 후에 변수를 찍어내야 오류가 안난다. |
예제 소스 |
#include "apue.h" #include <setjmp.h>static void f1(int, int ,int ,int ); static void f2(void); static jmp_buf jmpbuffer; static int globval; int main() { int autoval; register int regival; // CPU가 여유가 있을때만 속도를 높여주기위함. register 변수 volatile int volaval; static int statval; globval = 1; autoval = 2; // 최적화 가능. regival = 3; // 최적화 가능. volaval = 4; statval = 5; if(setjmp(jmpbuffer) != 0) { printf("after longjmp:\n"); printf("globval = %d, autoval = %d, regival = %d" " volaval = %d, statval = %d\n", globval, autoval, regival, volaval, statval); exit(0); } globval = 95; autoval = 96; // 최적화시 수행 안함. regival = 97; // 최적화시 수행 안함. volaval = 98; statval = 99; f1(autoval, regival, volaval, statval); exit(0); } static void f1(int i, int j, int k, int l) { printf("in f1 () : \n"); printf("globval = %d, autoval = %d, regival = %d," " volaval = %d, statval = %d\n", globval, i,j,k,l); f2(); } static void f2(void) { longjmp(jmpbuffer,1); } |
결과 값 |
최적화를 하지 않은 소스를 보면 mov 를 이용해 레지스터에 값을 저장하고, push로 메모리에 넣는다. 하지만 최적화를 한 소스를 보면 일단 전역변수와 volatile 변수만 값을 넣고 다른 지역변수는 값을 넣지 않고 일단 상수를 메모리에 넣어둔다. 그리고 함수가 호출되면 변수를 인자로 넣지 않고 상수를 바로 함수인자로 넣어버려서 마지막 리턴을 만나기 전에 값이 변하지 않고 초기값만 그대로 들어간다. 컴퓨터는 종료되기전에 위에 변수에 대입된 2, 3 을 넣는다. |
----- 소스 ------
----------------