키워드 「inline」 로 정의된 함수를 "인라인 함수"라 한다.
보통, 구조가 간단한 함수를 inline 처리해야 효율성을 높일 수 있다.
inline void Add(int a, int b)
{
return a + b;
}
클래스 또는 구조체 안에
멤버함수 정의부를 두면 자동 인라인 함수화한다.
소스코드를 .h와 .cpp로 분리하는 경우
컴파일시간에 인라인함수 코드가
확장될 수 있도록 함수 정의부는 헤더파일에 둔다.
(함수가 호출될 때 읽히기 때문에 미리 읽도록 처리)
A.h
class A
{
int res;
public:
inline int add(int a, int b);
void print(void);
};
inline int A::add(int a, int b)
{
res = a + b;
return res;
}
A.cpp
#include <iostream>
using namespace std;
#include "A.h“
void A::print(void)
{
cout << res << endl;
}
함수 호출/복귀 비용(prefix, suffix code)을 줄일 수 있으나
너무 많은 inline 함수는 프로그램 부피가 커지게 할 수 있다.
인라인 함수화 유의사항
• 재귀 함수는 컴파일러 설정에 따라 정의된 호출 Depth까지 호출된다.
그렇지 않은 경우 코드 길이가 커질 수 있다.
// MS compiler options
#pragma inline_recursion(on)
#pragma inline_depth(16) // 최대 16 Depth
• 가변인수 함수 인라인화 할 수 없다.
→ 컴파일 시간에 파라미터 개수를 파악할 수 없기 때문이다.
• 함수 포인터로 함수 호출하는 경우 인라인화 불가 (동적 바인딩)
* 인라인 함수 사용을 위한 컴파일러 옵션 확인하면 좋다.
인라인 함수 vs 매크로 함수
C 언어에서는 매크로 함수로 실행속도 성능을 어느정도 확보할 수 있다.
하지만 매크로 함수는 복잡한 형태를 정의하기에는 한계가 있다.
매크로는 전처리기에서 처리되지만
inline 키워드는 컴파일러에서 처리된다.
컴파일러는 인라인화가 성능 저하를 유발한다고 판단될 때
inline 키워드를 무시하기도 하다.
반대로 컴파일러는 필요에 따라서는 임의로 인라인화 시키기도 한다.
매크로 함수는 자료형에 의존하지 않는다.
#define SQUARE(X) ((X)*(X))
std::cout << SQUARE(12); // int 형
std::cout << SQUARE(3.15); // double 형
물론, 인라임 함수도 오버로딩(Overloading)으로 여러 데이터 타입을 정의할 수 있지만
필요한 타입 만큼 함수 개수가 늘어나게 된다.
그래서 C++에서는 템플릿(Template)으로 자료형에 의존하지 않을 수도 있다.
(한편으로 컴파일 시간에 올바른 인수 타입 검사가 필요하기도 하다.)
template <typename T>
inline T SQUARE(T val)
{
return val * val;
}
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C++] explicit 키워드 (0) | 2023.01.20 |
---|---|
[C++] 네임스페이스(namespace) 활용 (0) | 2022.08.09 |
[C++] 디폴트 파라미터(default parameter) (0) | 2022.08.05 |
💻 함수 오버로딩(Overloading) (0) | 2022.08.03 |
[C++] [STL] next_permutation (0) | 2022.01.05 |
댓글