인라인 함수의 필요성 - 오버헤드
함수의 실행과 종료 과정에서 종료를 할 때 시간 소모가 발생한다.
시간 소모량이 클수록 오버 헤드가 발생한다. 오버 헤드는 함수의 실행과 종료가 많아 질수록 시간 소모량이 커지면서 발생한다고 볼 수 있다.
오버 헤드는 다음과 같은 실행 플로우에서 발생한다.
함수 호출 오버헤드의 심각한 사례
다음 코드는 odd()함수의 x%2를 계산하는 시간보다, odd() 함수의 호출과 리턴에 따른 오버헤드 시간이 더 크다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <iostream> using namespace std; int odd(int x) { return (x % 2); } int main() { int sum = 0; for (int i = 1; i <= 10000; i++) { if (odd(i)) sum += i; } cout << sum << endl; } | cs |
인라인 함수란?
인라인 함수란 짧은 코드로 구성된 함수에 대해, 함수 호출 오버헤드로 인한 프로그램의 실행 속도 저하를 막기 위해 C++에서 도입된 방법이다.
인라인 함수 사용
인라인 함수는 함수 앞에 inline 키워드를 이용하여 선언한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <iostream> using namespace std; int inline odd(int x) { return (x % 2); } int main() { int sum = 0; for (int i = 1; i <= 10000; i++) { if (odd(i)) sum += i; } cout << sum << endl; } | cs |
인라인 함수의 장단점
인라인 함수는 아래 플로우 차트 처럼인라인 함수를 호출하는 곳에 인라인 함수의 코드를 그대로 삽입하여 호출이 일어나지 않게 한다.
인라인 함수의 사용 시 프로그램 실행속도는 빨라지는 장점이 있으나, 인라인 함수를 호출하는 곳이 많을 시 프로그램의 크기가 인라인 호출 함수의 중복 코드 만큼 늘어난다는 단점이 존재한다.
인라인 함수의 제약사항
line 선언은 컴파일러에게 주는 일종의 요청이며, 컴파일러는 함수의 크기나 효율을 따져서 불필요한 경우, inline 선언문을 무시할 수 있다.
컴파일러는 아래와 같은 소스를 가진 선언문은 인라인 함수로 허용하지 않는다.
* 재귀함수(recursion)
* static 변수
* 반복문
* switch 문
* goto 문
* 이외 ..
멤버 함수의 인라인 선언과 자동 인라인
생성자를 포함하여 클래스의 모든 멤버 함수가 인라인으로 선언될 수 있다.
C++ 에서 멤버 함수의 크기가 작은 경우 클래스의 선언부에 직접 구현하여도 무방하다.
컴파일러는 클래스의 선언부에 구현된 멤버 함수들에 대해서 inline 선언이 없어도 자동으로 인라인 함수로 자동 처리 한다.
가. 멤버 함수를 inline으로 선언한 경우
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <iostream> using namespace std; class Circle { private: int radius; public: Circle(); Circle(int r); double getArea(); }; inline Circle::Circle() { radius = 1; } inline Circle::Circle(int r) { radius = r; } inline double Circle::getArea() { return 3.14*radius*radius; } | cs |
나. 자동 inline으로 처리되는 경우
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <iostream> using namespace std; class Circle { private: int radius; public: Circle() { radius = 1; } Circle(int r); double getArea() { return 3.14*radius*radius; } }; Circle::Circle(int r) { radius = r; } | cs |
'Programming > C/C++' 카테고리의 다른 글
C++/C++ 프로그램 작성법 (0) | 2017.10.23 |
---|---|
C++/C++ 구조체 (0) | 2017.10.23 |
C++/접근지정자 (0) | 2017.10.22 |
C++/소멸자 (0) | 2017.10.22 |
C++/예제/클래스/ Rectangle 클래스 만들기 (0) | 2017.10.22 |