공부/C++ \C#

인라인 (Inline)

Lero God 2018. 8. 8. 11:38

사용 목적


C++에서 함수를 호출하면 어느정도의 비용이 듭니다. 함수를 호출하기 전에 컴파일러에서 자동으로 생성하는 코드의 일부를 Prefix라고 합니다. 함수 호출하기 전, Prefix의 코드를 실행해 CPU의 레지스터 상태, 플래그 등을 스택에 저장합니다. 이 작업은 메모리와 시간을 소요해서 실행 속도를 저하 시킵니다. 메모리나 성능이 제약된 프로세서를 프로그래밍 할 땐 이런 오버헤드는 무시하지 못할 성능 저하의 요인이 됩니다. 


이 오버헤드를 줄이기 위해서 인라인 키워드를 함수 앞에 붙여 사용합니다. 인라인 키워드를 붙인 함수를 호출하는 곳에 함수의 코드를 그대로 치환해 함수 호출 비용이 없습니다. 또한 이런 작업이 컴파일 도중에 일어나기 때문에 런타임 도중에 함수를 호출해서 생기는 성능 저하가 없습니다. 


사용 방법


클래스 내부에 정의 된 함수는 자동으로 인라인 함수가 됩니다. 클래스 외부에서 정의 할땐 함수 정의 앞에 인라인 키워드를 붙이면 인라인 함수가 됩니다. 이 때 주의할 점은 함수를 헤더파일 내에 선언했으면 헤더 파일 내에서 함수를 정의해야 한다는 것입니다. 인라인 함수는 정의부분과 선언부분이 다른 파일에 있으면 오류가 나기 때문에 cpp 파일에서 정의하면 오류가 생깁니다. 클래스와 인라인 함수를 모두 cpp에 정의 했더라도 보통 함수로 만들게 됩니다. 


주의 할 점


●  클래스 내에 함수를 정의하면 자동으로 인라인 함수가 되는데, 가독성을 위해서 명시적으로 인라인 키워드를 붙혀주면 좋습니다.


●  큰 크기의 캐쉬 히트가 낮아의 적중률이 낮아서 오히려 성능 저하가 일어납니다.


●  자주 호출되고 3 ~ 5줄 정도 길이의 코드의 함수를 인라인 함수로 만듭니다.


●  재귀 함수, 반복문, switch문이 포함된 함수는 인라인 키워드를 붙혀도 컴파일러에서 인라인 선언을 무시 할 수 있습니다.   


사용 예시


class TestInline
{
public:
	// 클래스 내에서 함수를 정의하면 자동으로 인라인 함수화 되지만 가독성을 위해 인라인 키워드를 붙여주는게 좋다
	inline int GetNumber() { return m_Test; } 
	void SetNumber(int);

private:
	int m_Test;
};

// 함수를 같은 헤더파일 내에 정의할때 앞에 인라인 키워드를 붙여 주면 인라인 함수화
inline void TestInline::SetNumber(int number) 
{
	m_Test = number;
}




참고 :  http://carstart.tistory.com/100http://studymake.tistory.com/293https://impressprogram.github.io/cpp/2017/02/02/cpp-inline-function.html