inline 키워드
C++/C++ 2021. 3. 22. 04:37 |Inline Functions (인라인 함수)
인라인 함수란?
- 컴파일러는 일반적인 함수 호출 코드를 발견할 경우
특정 함수의 Code Section의 주소를 찾아가는(JMP) 방식으로 컴파일한다.
하지만 Inlining(인라인 화) 조건을 만족할 경우
함수 호출을 위한 오버헤드를 줄이기 위해
JMP대신 해당 함수의 바디 부분을 코드로 대체시켜버린다.
이 것을 Inlining(인라인 화) 또는 inline expansion(인라인 확장)이라고 한다.
인라인화 예시
// 인라인화 하기 전
double Square(double x)
{
return x*x;
}
int main()
{
double length = 3.14;
double area = Square(length);
}
위의 코드는 아래와 같이 Inlining됩니다.
// 인라인화
int main()
{
double length = 3.14;
double area = length * length; // 이해를 돕기위한 표현이며 실제로는 상수이기 때문에 9.8596으로 상수로 치환 해버림...
}
함수 인라인 화를 위한 조건
1) 함수에 inline 키워드가 붙었을 경우
- 인라인 화를 할만한 가치이 있다고 분석되는 경우.
즉, 코드 양이 늘더라도 함수 호출 오버헤드를 줄이는 것이 이득인 경우.
2) 함수에 forceinline 키워드가 붙었을 경우
- forceinline 키워드는 비용적인 측면 분석을 무시하고,
오로지 컴파일 시에 Inlining 가능 여부 조건만을 검사한다.
즉, Inlining 가능한 최소 조건만 만족한다면 Inlining 시켜버린다는 의미.
※ Inlining 불가능 한 경우
1) 재귀 함수
- #pragma inline_resursion(on)을 하지 않은 경우
재귀함수는 최대 16번의 깊이까지 Inlining 가능하며(MSVC기준), 깊이를 조절은 #pragma inline_depth를 사용
- Transition Unit의 다른 위치에서 포인터를 통해 참조되는 함수.
- 함수 및 호출자(Caller)가 다양한 형식의 예외 처리를 사용할 경우
예) 한곳에서는 C++ 예외 처리, 다른 곳에서는 구조적 예외 처리하는 경우
- 함수가 가변인자 리스트를 가지고 있는 경우
- 가상함수 이면서 동시에 가상적으로 호출되는 경우
(가상함수에 대한 직접호출은 Inlining된다)
- __declspec( naked ) 한정자가 표시된 함수
- 외부에 정의되어 있거나,
- 보안 특성이 부여된 경우
흔히 착각하는 inlining 조건
- inline 키워드가 붙어 있어야한다.
- forceinline 키워드만 붙으면 컴파일러가 무조건 인라인 화를 시켜준다
- 가상 함수는 무조건 인라인 화가 되지 않는다.
docs.microsoft.com/ko-kr/cpp/cpp/inline-functions-cpp?view=msvc-160#example-2
인라인 함수(C++)
C++ 인라인 키워드를 사용하여 컴파일러에 인라인 함수를 제안할 수 있습니다.
docs.microsoft.com
https://docs.microsoft.com/en-us/cpp/cpp/inline-functions-cpp?redirectedfrom=MSDN&view=msvc-170
Inline Functions (C++)
The C++ inline keyword can be used to suggest inline functions to the compiler.
docs.microsoft.com
가상함수가 인라인화 되는 경우
struct Base
{
virtual void Function(void) const = 0:
};
struct Derived: public Base
{
virtual void Function(void) const
{
std::cout << "Hello" << std::endl;
}
};
void Func( Base &base )
{
base.Function();
}
int main(int, char**)
{
Derived derived;
Func( delived ); // Inlining 됨
return 0;
}
위 코드는 다형성을 이용한 묵시적 형변환으로 인해 업캐스팅 되는 경우이다.
컴파일 시 Func함수에 인자로 전달된 derived변수가
Derived 타입이라는 것을 추론할 수 있으므로 Func는 인라인화 된다.(핵심은 컴파일 타임에 추론 가능 여부)
업캐스팅에 대하여 원본의 타입을 추론할 수 있기 때문에 인라인화로 이어진 것이다.
따라서 컴파일 시 타입 추론이 되는 경우는 전부다 인라인화 가능하다.
'C++ > C++' 카테고리의 다른 글
override 와 final 키워드 (0) | 2021.03.26 |
---|---|
성능 개선을 위한 가이드 (0) | 2021.03.24 |
noexcept as specifier & operator (0) | 2021.03.19 |
Visual Studio에서 특정 컴파일 경고를 오류로 처리하기 (0) | 2021.03.17 |
가상함수(작성 중) (0) | 2021.03.17 |