티스토리 뷰
주의 사항!
- 이 글은 제가 직접 공부하는 중에 작성되고 있습니다.
- 따라서 제가 이해하는 그대로의 내용이 포함됩니다.
- 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다.
C언어에서 '매크로 함수'라는 것을 배웠습니다. 인라인 함수는 매크로 함수의 장점을 유지하면서 단점을 줄인 C++의 매크로 함수라고 생각할 수 있습니다. 인라인 함수의 사용법을 예제를 통해 알아보겠습니다.
#include <iostream>
inline int SQUARE(int x)
{
return x * x;
}
int main()
{
std::cout << SQUARE(5) << std::endl;
std::cout << SQUARE(12) << std::endl;
}
/*
실행결과
25
144
*/
위의 예제를 보면 인라인 함수는 inline 키워드를 맨 처음 사용함을 알 수 있습니다. 나머지는 일반 함수의 선언 및 정의와 다르지 않습니다. 만약 위의 예제를 매크로 함수로 구현한다면 다음과 같습니다.
#include <iostream>
#define SQUARE(x) ((x)*(x))
int main(void)
{
std::cout << SQUARE(5) << std::endl;
std::cout << SQUARE(12) << std::endl;
return 0;
}
/*
실행결과
25
144
*/
매크로 함수는 전처리기에 의해서 처리되지만, 키워드 inline을 사용한 인라인 함수는 컴파일러에 의해 처리됩니다. 만약 컴파일러가 inline 키워드를 사용한 함수가 오히려 성능에 해가 된다고 판단하면 이 키워드를 무시하기도 합니다. 또한 컴파일러는 필요한 경우 일부 함수를 임의로 인라인 처리하기도 합니다.
사실 인라인 함수는 매크로 함수의 장점을 완전히 대체하지는 못했습니다.
#define SQUARE(x) ((x)*(x))
std::cout<<SQUARE(5);
std::cout<<SQUARE(3.14159);
위와 같이 정의된 매크로 함수는 자료형에 의존적이지 않으므로 인수 x의 자료형에 관계없이 사용할 수 있습니다. 하지만 다음과 같은 인라인 함수의 경우는 다릅니다.
inline int SQUARE(int x)
{
return x * x;
}
std::cout<<SQUARE(5);
std::cout<<SQUARE(3.14159);
인라인 함수는 자료형에 의존적이며 3.14159를 인수로 받는 경우 정수로 연산이 되어 3*3 = 9가 됩니다. 이를 함수의 오버로딩을 이용해 보완할 수 있지만 그렇게 되면 여러 개의 함수를 선언하고 정의해야 합니다.
그러나 C++의 '템플릿'이라는 것을 이용하면 매크로 함수와 같이 자료형에 의존적이지 않은 함수를 만들 수 있습니다. 템플릿은 나중에 공부하게 되니 여기서는 간단한 예만 보이겠습니다.
#include <iostream>
template <typename T>
inline T SQUARE(T x)
{
return x * x;
}
int main(void)
{
std::cout << SQUARE(5.5) << std::endl;
std::cout << SQUARE(12) << std::endl;
return 0;
}
/*
실행결과
30.25
144
*/
위의 실행결과를 보면 매크로 함수와 같이 인수의 자료형에 관계없이 데이터 손실이 발생하지 않음을 알 수 있습니다.
인라인 함수는 겉보기에 inline 키워드만 붙었을 뿐 일반 함수와 별 다를 게 없어 보입니다. 그래서 인라인 함수만의 특장점이 무엇인지 잘 모를 수 있습니다. 일반 함수를 선언하고 호출하는 경우, 다음과 같은 일들이 일어납니다.
- 호출된 함수를 위한 스택 메모리 할당
- 실행 위치의 이동과 매개변수로의 인자 전달
- return문에 의한 값의 반환
하지만 매크로 함수의 경우 이런 일련의 과정이 발생하지 않고 코드를 그대로 복붙하듯 동작하기 때문에 실행 속도는 일반 함수에 비해 빠릅니다. 앞서 인라인 함수는 C++의 매크로 함수라고 했습니다. 즉, 인라인 함수 역시 매크로 함수와 비슷하게 코드를 복붙하듯 동작합니다. 그러면서도 매크로 함수의 단점인 전역적인 특성과 디버깅하기 힘들다는 단점을 크게 보완하였습니다.
인라인 함수는 간단한 함수를 구성할 때 사용하기 좋습니다. 하지만 이를 남용하게 될 경우에는 코드 실행 파일의 크기가 커지기 때문에 오히려 성능에 악영향을 줄 수 있습니다(인라인 함수가 호출될 때마다 코드를 복붙하므로). 하지만 inline 키워드를 사용해 인라인 함수를 정의해도 이 함수를 인라인 함수로 다룰 것인지 일반 함수로 다룰 것인지는 컴파일러 마음이므로 어쩌면 인라인 함수가 남용되었을 때 이를 일반 함수로 취급할지도 모를 일입니다.
호출 빈도가 낮고 간단한 함수는 인라인 함수로 정의하는 습관을 들여보는 것도 좋을 것 같습니다.
'공부 일지 > CPP 공부 일지' 카테고리의 다른 글
C++ | 새로운 자료형 bool (0) | 2021.07.31 |
---|---|
C++ | 네임스페이스(namespace) (0) | 2021.07.31 |
C++ | 매개변수의 디폴트 값 (0) | 2021.07.31 |
C++ | 함수 오버로딩 (0) | 2021.07.31 |
C++ | 표준 입출력과 출력 포맷 (0) | 2021.07.31 |