반응형

0. 시작하기

 

1. 인라인 이란? (Inline)

'인라인'이란 말그대로 라인안에 들어가는 함수라는 의미입니다.

 

프로그램을 수행하다가 프로그램이 함수를 만나게되면, 스택에 현재의 상태를 저장하고 프로그램의 수행위치를 함수의 시작부분으로 이동시킵니다. 그리고 반환값을 받으면 반환값을 갖고 원래의 프로그램 수행위치로 돌아오는 과정을 갖게됩니다.

 

하지만, '인라인'함수는 컴파일러가 해당 함수를 원래코드에 삽입해주기 때문에, 위의 [함수의 호출]과정이 생략됩니다.

 

쉽게말해서 빠릅니다.

 

때문에 빠르게 처리가 필요하고 자주 수행되는 기능의 경우 인라인처리를 하는것이 유리할 수 있습니다.

 

물론 단점도 있습니다.

 

과도하게 인라인처리를 하게되면, 불필요한 부분까지 인라인 함수가 삽입되여, 프로그램이 비대해진다는 문제가 생기게됩니다.

 

따라서 개발시 인라인처리를 하면 무조건 좋은 성능을 낸다라고 맹목적으로 생각하시면 안됩니다.

( 컴파일러를 전적으로 믿지 마세요. )

 

 

 

2. 매크로 함수 ( CPP/Macro.cpp )

C++의 인라인 함수는 C언어의 매크로 함수와 자주 비교되어 언급됩니다.

이유는 두가지 모두 코드에 삽입되는 형태로 작동하기 때문이라고 생각됩니다.

하지만, '인라인 함수'와 '매크로 함수'는 본질적으로 큰 차이가 있습니다.

이를 비교하기 위해 인라인 함수를 다루기 전에 먼저 매크로 함수를 집고 넘어가겠습니다.

 

메크로 함수에 대해서 말해보자면, 메크로 함수는 [전처리기]에서 작동하는 함수입니다.

따라서 아래와 같은 메크로 함수를 사용하는 코드가 있다고 보겠습니다.

 

#include <iostream>
#define ADD(x,y) ((x+y))

int main(void){
	std::cout << ADD(1,2) << std::endl;
    
    return 0;
}

 

실행하면 "3"이라는 결과를 얻을 수 있습니다.

 

위의 코드에서 #define 으로 명시된 부분이 매크로함수입니다. 이부분은 전처리기에서 ADD(x,y)를 ((x+y))형태로 변환시키라는 명령을 갖고있습니다. 전처리기가 위와같은 명령을 수행한 후 컴파일러로 해당내용을 전달하게됩니다.

 

이게 무슨 문제가 되는가?

 

매크로 함수는 [한글 프로그램]의 [찾아 바꾸기]기능과 큰 차이가 없습니다.

 

정확하게, '잘~' 사용하면 편리한 기능입니다. 하지만, 다르게 본다면 의도하지 않은 프로그램이 탄생합니다.

 

간순히 입력구문을 치환하는 것이기 때문에 단순한 형변환의 과정에 있어서도 위의 경우 x,y가 정수라면 int형 결과를 발생시키고, 소수라면 double이나 float형의 결과를 발생시킵니다.

 

위와같은 정형화되지 못한 결과가 다른 함수의 입력으로 들어갈 경우 데이터 손실 또는 프로그램 자체가 애러를 내뱉은 문제를 야기할 수 있습니다.

 

때문에 사실상 매크로 함수는 잘 사용하지 않습니다.

(#define pi 3.14 에만 사용합니다.)

 

 

 

3. 인라인 함수 ( CPP/Inline.cpp )

다음으로 인라인 함수에 대해서 다뤄보겠습니다.

 

인라인 함수는 매크로함수와 다르게 [컴파일러]에 의해서 처리되는 합수입니다.

 

컴파일러가 처리한다는 의미는 다시말해, 해당 함수가 인라인으로 처리됨에 따라 성능에 저하가 발생할 경우 컴파일러가 인라인 키워드를 무시하고 처리하는 경우도 발생할 수 있다는 뜻이기도 합니다.

 

예제를 한번 보겠습니다.

 

#include <iostream>

inline int ADD(int x, int y){
    return x+y;
}

int main(void){
    std::cout << ADD(1,2) << std::endl;

    return 0;
}

 

위의 함수도 실행하면 3이라는 결과를 내뱉습니다.

 

매크로 함수와 비교해서 본다면 확실하게 차이를 알 수 있습니다.

 

바로 함수의 입력으로 들어오는 인자와 반환값에 대한 정확한 데이터 타입이 정해져 있다는 것입니다.

(사실 inline 이라는 부분이 없으면 일반 함수와 차이가 없습니다.)

 

위와같이 데이터 타입을 정의해줌으로 매크로함수에서 발생할 수 있는 문제들을 예방할 수 있습니다.

반응형

+ Recent posts