CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): touch (남 기 원)
날 짜 (Date): 1994년12월13일(화) 23시16분50초 KST
제 목(Title): [A] C-compiler의 -g/-O 옵션


C 컴파일러의 -g나 -O 옵션에 대해서는

도사가 아니더라도 매뉴얼을 보시면 (% man cc) 아실 수 있습니다.

먼저 -g를 사용하면 -O는 무시된다는 것을 알려드리면서 시작하겠습니다.

사용하시는 시스템이 IBM이라고 하셨는데, 제 주위에는 IBM기계가 없으니

같은 System V 계열인 Silicon Graphics Inc.의 IRIS와,

BSD 계열인 Sun의 경우를 예로 들겠습니다.

 ------------------------------------------------------------------------------

(1) IRIS의 IRIX (System V)

    -g 옵션은 -g0, -g1, -g2, -g3의 네 단계가 있고,
                        ^^^(default)
    -O 옵션도 -O0, -O1, -O2, -O3의 네 단계가 있습니다.
                   ^^^(default)

        -g0: no symbol table. -g와 -O 옵션이 다 없으면 default로 선택됨

        -g1, -g2: 심벌 테이블을 만들고 최적화(-O)는 무시. -g는 -g2를 의미하고
             -g1은 -g2보다 조금 적은 내용의 심벌 테이블을 생성

        -g3: 최적화된 코드에 심벌 테이블을 만들기 때문에 심벌 테이블은 생성하나
             dbx를 이용한 디버깅은 곤란함.
             -O, -O1, -O2, -O3 모두와 함께 사용가능

        -O0: no optimization

        -O1: 빠른 시간 안에 할 수 있는 optimization은 다 하라는 옵션 (default)

        -O2: 흔히 생각하는 최적화의 최고 단계

        -O3: 전체 프로그램을 라이브러리까지 모조리 묶어서 최적화.
             .o만을 생성하는 -c 옵션은 사용불가.
             Shared library mode도 사용불가.
                사용예: % cc -non_shared -O3 a.c b.c ... z.c
             (주) 프로그램 개발이 끝났을 때, distribution 직전에
                  최종적으로 컴파일할 때, shared library를 사용하지 않는 것이
                  더 낫다고 판단될 경우 사용하기에 적합

(2) SUN의 SunOS (BSD)

    심벌 테이블은 -g(for dbx)와 -go(for adb) 옵션에 의해 만들어집니다.

    -O 옵션은 -O1, -O2, -O3, -O4의 네 단계가 있습니다.
                   ^^^(default)

        -O1: 어셈블리 레벨의 최적화

        -O2: 코드 생성 이전의 전반적인 최적화 (default)

        -O3: -O2와 같으나, 외부 변수(external variables)에 대한 최적화까지 고려

        -O4: -O3와 같으나, pointer assignment의 결과까지 고려

 ------------------------------------------------------------------------------

심벌 테이블이 실행 시간에 미치는 영향은

다음 테스트 결과를 보시면 쉽게 아실 수 있을 겁니다.

/*
 *      A Sample C code (a.c)
 */

main()
{
        int     i;

        for (i = 0; i < 10000000; i++)
                do_something();
}

do_something()
{
        int     a, b, c;

        a = 10;
        b = 3;     /* a redundant assignment, to be removed by optimization */
        c = 4;
        b = a * c;
}

/*
 *      End of the C code
 */

 ---------------- Silicon Graphics Inc.의 Indigo-2에서의 결과 ----------------

% cc -O2 a.c
% time a.out
1.1u 0.0s 0:01 103% 0+0k 0+0io 0pf+0w
^^^^
% cc -g0 a.c
% time a.out
2.0u 0.0s 0:01 105% 0+0k 0+0io 0pf+0w
^^^^
% cc -g a.c
% time a.out
3.4u 0.0s 0:03 102% 0+0k 0+0io 0pf+0w
^^^^

그럼, 조금이나마 도움이 되었으면 합니다.






[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.