인라인함수로 프로그램 코드 최적화 (C++ inline함수)

인라인함수로 프로그램 코드 최적화 (C++ inline함수)


C++ 코드 최적화를 할 때 프로그램 코드엔 인라인함수가 있어야 합니다. C++ 객체지향 프로그래밍에 인라인함수가 갖는 장점을 적극적으로 활용하기 위함이죠. 이 포스트에선 함수 호출할 때 발생하는 오버헤드를 해결하는 인라인함수를 설명합니다. 프로그램 코드 최적화로 실행 속도를 개선하려면 반드시 인라인함수 사용이 필요합니다.


10.4 인라인함수들(Inline Functions)


인라인함수들은 함수 호출 때문에 초래되는 오버헤드를 제거할 수 있으며 여전히 보통의 함수들의 장점들을 제공한다. 그러나, 인라인화 하는 것은 만병통치약이 아니다. 어떤 상황들에서, 그것은 프로그램의 성능을 저하할 수도 있다. 이러한 특징을 현명하게 사용하는 것이 중요하다.


10.4.1 함수 호출 오버헤드(Function Call Overhead)


보통의 함수 호출의 정확한 비용은 구현에 종속적이다. 그것은 보통 현재 스택 상태를 저장하고 스택으로 함수의 인수들을 푸시하고 그것들을 초기화하며 함수의 명령들을 포함하는 프로그램 코드 상, 메모리 주소로 점프하는 것을 포함한다. (그 이후에 함수가 실행 시작)

함수가 리턴할 때 역순의 동작들이 발생한다. 다른 언어들(Pascal 및 COBOL과 같은), 함수 호출의 오버헤드는 훨씬 더 두드러지는데 그 이유는 구현이 함수 호출 이전과 이후에 수행하는 추가적인 동작들이 존재하기 때문이다.

C++ 인라인함수[C++ Inline] 인라이닝 기법

단지 데이터 멤버의 값들 반환하는 멤버 함수를 위하여 이 오버헤드는 허용될 수 없다. 인라인함수들은 그러한 accessor 및 mutator 멤버 함수들(각각 getters 및 setters)의 효율적인 구현을 허용하기 위하여 C++ 프로그램 코드에 추가할 수 있다.


비 멤버 함수들 또한 인라인함수로 선언될 수 있다.


10.4.2 인라인함수들의 이점들(Benefits of Inline Functions)


함수를 인라인 화하는 것의 이점들은 분명하다. 사용자의 관점으로부터 인라인 된 함수는 보통의 함수처럼 보인다. 그것은 인수들과 반환 값을 가질 수 있다; 게다가 그것은 그 자신의 범위(scope)를 가지며 full-blown 함수 호출의 오버헤드를 초래하지 않는다.


덧붙여 그것은 매크로를 사용하는 것보다 현저하게 더 안전하고 디버깅하기에 더 쉽다. 그러나 그곳에는 더 많은 이점이 존재한다. 함수의 몸체가 인라인함수화될 때 컴파일러는 결과하는 프로그램 코드를 함수의 코드 단독으로 수행할 수 없는 문맥-특정(context-specific) 최적화 들을 적용함으로써 더 최적화할 수 있다.


C++ 인라인 함수[C++ Inline] 인라이닝 기법


객체지향 프로그래밍 클래스 몸체 안쪽에서 구현되는 모든 멤버 함수들은 암묵적으로 inline 으로 선언된다. 덧붙여 컴파일러가 합성한 생성자들, 복사 생성자들, 할당 연산자들 및 소멸자들은 암묵적으로 inline으로 선언된다.


예를 들면, 


1
2
3
4
5
6
7
8
9
class A 
{
private:
        int a;
public:
        int Get_a() { return a; }               // 암묵적으로 인라인 함수
        virtual void Set_a(int aa) { a = aa; } // 암묵적으로 인라인 함수
        // 컴파일러가 합성한 규준적인 멤버 함수들 또한 인라인 함수로 선언된다
};
cs


그러나 인라인 specifier가 단지 컴파일러에 대한 권고사항이라는 것을 깨닫는 것이 중요하다. 컴파일러는 이러한 권고사항을 무시하고 함수를 outline 화 하는데 자유롭다;


그것은 또한 명시적으로 인라인함수로 선언되지 않았던 함수를 인라인화할 수 있다. 다행스럽게도 C++ 프로그램 코드는 함수의 의미론은 단지 그것이 인라인 되거나 되지 않기 때문에 컴파일러에 의해서 변경될 수 없다는 것을 보장한다.


비주얼스튜디오 C++ 인라인 함수[C++ Inline] 인라이닝 기법


예를 들면, 그것이 컴파일러에 의해 인라인화되었는지의 여부와 무관하게 인라인함수로 선언되지 않았었던 함수의 주소를 얻는 것이 가능하다. (그러나 결과는 함수의 outline 사본의 생성이다)


컴파일러는 어떤 함수들이 인라인화되어야 하고 어떤 것이 인라인 화 되어서는 안 되는가를 어떻게 결정하는가? 그것들은 다양한 기준들에 의존하여 인라인화를 위한 최상의 후보들을 선택하기 위해 설계된 고유한 경험들을 가진다.


이들 기준은 함수 몸체의 크기, 그것이 지역 변수들을 선언하고 있는지의 여부, 그것의 복잡도(예를 들면, 회귀(recursion) 및 루프들은 보통 함수를 인라인 화로부터 자격을 박탈한다), 그리고 추가적인 구현 및 문맥 종속적인 요소들을 포함한다.


인라인함수로 프로그램 코드 최적화 (C++ inline함수)

댓글(0)

Designed by JB FACTORY