Effective C++에서 본 내용인데 우연히 인터넷속에서 또 보게 되었다..
책에서 볼 땐 별로 와 닿지 않았었지만,
이렇게 충분한(?) 예제를 보니깐, 다시한번 마음에 와 닿는다.

//1. 매크로
01: #include
02: #define MAX(a,b) (a>b? a:b)
03:
04: void main()
05: {
06: int x=20, y=80,r;
07: r= max(x++,y++);
08: cout << "x= " << x << "y= " << y << "r= "<< r << endl;
09: }

결과 x=21 y=82 r=81


//2. 인라인
01: #include
02: inline int max(int a, int b) { return(a>b? a:b); }
03:
04: void main()
05: {
06: int x=20, y=80, r;
07: r=max(x++,y++);
08: cout<< "x= "<< x << "y= " << y << "r= " << r;
09: }

결과 x=21 y=81 r=80

------------------------<<설명선>>------------------------

매크로함수의 홰궤한 결과가 보이는가?
위의 결과는 왜그럴까? 사실 매크로함수와 인라인함수의 컴파일처리과정만 알면 무지무지 간단한 이야기이다.

< 실행파일이 만들어지는 4 단계 >
1) 코딩(coding)
2) 전처리기(Preprocessor)에서의 전처리(preprocessing)
3) 컴파일러(Compiler)에서의 컴파일링(compiling)
4) 링커(Linker)에 의한 링킹(linking)

사실 Tool에서 코딩하고 그냥 컴파일만 시키면 2)~4)작업은 한꺼번에 이루어지며 실행파일이 생성된다. 그렇다고 2)랑 3)작업단계의 차이를 무시하면 위와같은 실행결과의 차이를 가져온다는 말이다.

매크로함수는 2)해서 전처리기에 의해 치환이되고
인라인함수는 3)에서 컴파일러에 의해 처리된다.

다시말하면 1.매크로의 08번줄은 컴파일에 들어가기전에
r= max(x++,y++);에서 r = x++ > y++ ? x++ : y++;로 바뀌게 된다.
즉, x와 y값의 크기를 비교한 후에 두 변수의 값을 각각 1씩 증가시키고 증가된 x와 y값중에서 큰 값만을 r에 저장한 후에 저장된값만을 1증가 시킨다.

이에 반해 2. 인라인의 경우 일반 함수와 동일하다
call by value를 쓰고 있고, 호출이 이루어진 다음에 변수 x와 y의 값을 1씩 증가시키므로 증가시킨 값이 함수 max()를 호출한 매개변수 값에는 영향을 미치지않았다.
따라서 x와 y의 값은 1씩 증가하여도 r에 저장되는 값에는 변화가 없었던 것이다.-

- 교훈 -
1. 매크로 함수를 사용할 경우에는 보다 신중하자.
매크로문은 선행처리기가 처리하므로 컴파일러가 오류를 찾아내지 못한다. 즉, 잠깐 딴 생각하면서 코딩을 하면 의도했던 바와 다른 결과가 나올수 있다.

2. 인라인화 하고 안하고는 컴파일러 마음이다.
인라인 함수도 컴파일러에 의해 코드의 치환이 일어난다.
일 반함수처럼 원형을 보고 검사하고 호출하는 단계가 없어져 빠르고, 컴파일러가 수행하므로 잘못된 것이 있다면 컴파일타임에 즉시 알수도 있다. but "inline"이라고 지시자를 줘도 인라인화를 시키는 것은 컴파일러맘이다. inline선언을 했다고 다~ inline이 되는 것은 아니다.

3. 실행파일크기를 고려하자
인라인함수이나 매크로함수나 코드의 치환이 일어나기 때문에 loop내에서 호출한다거나 하면 소스의 크기가 무진장 길어진다. 당연히 실행 파일의 덩치가 엄청커진다. 루프에서 쓰지말자

4. 인라인함수는 헤더파일에서...
인라인 함수는 내부 연결성을 가지기 때문에 헤더 파일에 넣어야 어러 소스 파일에서 불러 쓸 수 있다. 따라서 인라인 함수의 정의가 바뀌면 그 인라인 함수와 의존 관계에 있는 사용자 코드는 모두 컴파일을 다시 해야 한다



'0x0001 > C, C++' 카테고리의 다른 글

[Command] Batch Shell Command  (0) 2019.02.23
[C언어] 주석 TIP  (0) 2019.02.09
[C언어] n 에서 m 까지의 합을 재귀로 작정  (0) 2019.02.09
[C++] Vector와 List의 차이점  (0) 2019.02.08
[C++] 함수객체 ( Functor )  (0) 2019.02.08

+ Recent posts