인라인(inline) 함수

곽경호·2024년 1월 10일

inline 함수란?

in은 '내부'를 뜻하고 line은 '프로그램 코드라인'을 뜻한다 따라서 inline 함수를 직역하면 '프로그램 코드라인 안으로 들어가버린 함수'를 의미한다

매크로 함수

매크로 함수의 장점

  • 일반적인 함수에 비해 실행속도가 빠르다
  • 자료형에 구애받지 않는다

매크로 함수의 단점

  • 크기가 커질수록 가독성이 떨어진다
  • 복잡한 함수를 구현하기에는 무리가 있다

매크로함수의 예시

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

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

위의 코드를 전처리 과정을 거치면 아래와 같이 코드가 바뀐다

#include <iostream>

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

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

그러면
"매크로 함수는 정의하기 복잡하니, 일반 함수처럼 정의가 가능하면 좋겠다!"
라는 생각이 들것이다

인라인 함수는 이런 요구사항들을 만족한다

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

#include <iostream>

//인라인 함수 정의
inline int SQAURE(int x){
    return x*x;
}

int main(void){
	//인라인 함수 호출
    std::cout<<SQAURE(5)<<std::endl;
    std::cout<<SQAURE(12)<<std::endl;
    return 0;
}

매크로 함수의 인라인 화는 전처리기에 의해서 처리 되지만, inline 키워드를 이용한 함수의 인라인화는 컴파일러에 의해서 처리된다
컴파일러는 함수의 인라인화가 오히려 성능 저하를 불러일으킨다고 판단되면 키워드를 무시하기도 한다.

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

사실 위의 인라인 함수는 매크로 함수의 장점을 대체하지 못했다.
예를들어
#define SQUARE(x) ((x)*(x))
와 같이 정의되면 자료에 의존적이지 않은 함수로 정의 할 수있다.

std::cout<< SQUARE(12)<<std::endl; //int형 함수 호출
-> std::cout<<((12)\*(12))<<std::endl; //int형
std::cout<< SQUARE(3.15)<<std::endl; //double형 함수 호출
->std::cout<<((3.15)\*(3.15))<<std::endl; //double

매크로 함수는 이런식으로 변환이 이루어져 데이터의 손실이 발생하지 않는다

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

하지만 다음과 같이 정의된 인라인 함수는 int형 기반으로 정의된함수이기 때문에 다음과 같은 형태의 함수 호출 문장에서 데이터 손실이 발생한다

std::cout<< SQURE(3.15);

하지만 이 부분도 C++의 템플릿을 이용한다면 데이터 손실을 해결 할 수있다. 여기서는 간단하게 예시만 보이고 넘어가겠다.

#include <iostream>
template <typename T>
inline T SQAURE(T x){
    return x*x;
}

int main(void){
    std::cout<<SQAURE(5.5)<<std::endl;
    std::cout<<SQAURE(12)<<std::endl;
    return 0;
}
profile
개발 블로그 임미다

0개의 댓글