[01-4] 인라인(inline) 함수

김민성·2022년 7월 10일
post-thumbnail

'inline 함수'라는 이름의 의미부터 이해해보자. in은 '내부'를 의미, line은 '프로그램 코드라인'을 의미한다. 의역해보면, '프로그램 코드라인 안으로 들어가 버린 함수'라는 뜻이 된다.

매크로 함수의 장점

매크로 함수의 형태는 #define ... 이다.
매크로 함수의 장점은 다음과 같다.

"일반적인 함수에 비해서 실행속도의 이점이 있다."

단점은,

정의하기가 어렵다. 
복잡한 함수를 매크로의 형태로 정의하는데 한계가 있다.

C언어를 복습하는 겸, 매크로 함수를 하나 봐보도록 하자.

#include <iostream>
#define SQUARE(x) ((x)*(x))

int main(void) {
	std::cout<< SQUARE(5) <<std::endl;
    return 0
}

위의 코드는 전처리 과정을 거치면 다음과 같이 된다.

#include <iostream>
#define SQUARE(x) ((x)*(x))

int main(void) {
	std::cout<< ((5)*(5)) <<std::endl;
    return 0
}

위 예제와 같이 함수의 몸체부분이 함수호출 문장을 완전히 대체했을 때, '함수가 인라인화 되었다'라고 표현한다.

여기서 매크로 함수는 정의하기가 복잡하니, 일반 함수처럼 정의가 가능하면 좋겠지 않겠는가?

그래서 C++의 인라인 함수가 있는 것이다!

C++ 기반의 인라인 함수 정의

InlineFunc.cpp

#include <iostream>

inline int SQUARE(int x) {
    return x*x;
}

int main(void) {
    std::cout<<SQUARE(5)<<std::endl;
    std::cout<<SQUARE(12)<<std::endl;
    return 0;
}
25
144

매크로를 아용한 함수의 인라인화는 전처리기에 의해 처리되지만,
inline을 이용한 함수의 인라인화는 컴파일러 에 의해 처리가 된다.

매크로 함수에는 있지만, 인라인 함수에는 없는 장점

#define SQUARE(x) ((x)*(x))

위는 자료형에 의존적이지 않은 함수가 되어서

std::cout<< SQUARE(12); //int형 함수호출
std::cout<< SQUARE(3.15); //double형 함수호출

다음과 같이 변환이 이뤄져서 데이터 손실이 발생하지 않는다.

std::cout<< ((12)*(12)); //int형 함수호출
std::cout<< ((3.15)*(3.15)); //double형 함수호출

하지만 다음과 같이 정의된 인라인 함수는,

inline int SQUARE(int x) { return x*x; }

int형 함수이기 때문에 다음의 함수호출 문장에서 데이터 손실이 발생한다.

std::cout<< SQUARE(3.15); 
//0.15가 손실되어서 3x3의 결과인 9가 출력!

물론 함수의 오버로딩을 통해 이 문제를 해결할 수 있으나, 한번만 정의하면 되는 매크로 함수의 장점과는 거리가 멀어진다.
그러나, C++의 템플릿이라는 것을 이용하면 매크로 함수와 마찬가지로 자료형에 의존적이지 않은 함수가 완성된다.

간단히 예를 보자면,

#include <iostream>

template <typename T>
inline T SQUARE(T x) {
	return x*x;
}

int main(void) {
    std::cout<<SQUARE(5)<<std::endl;
    std::cout<<SQUARE(12)<<std::endl;
    return 0;
}

템플릿에 대해서는 나중에 천천히 알아가보자.

profile
다양한 활동을 통해 인사이트를 얻는 것을 즐깁니다. 저 또한 인사이트를 주는 사람이 되고자 합니다.

0개의 댓글