728x90
반응형
#include <iostream>

using namespace std;
/* 매크로를 이용한 함수의 인라인화는 전처리기에 의해 처리 */
//#define SQUARE(X) ((X)*(X))

/* 일반 함수 이용 */
//int Square(int x)
//{
//	return x * x;
//}

/* 키워드 inline을 이용한 함수의 인라인화는 컴파일러에 의해 처리 */
//inline int Square(int x)
//{
//	return x * x;
//}

/* 템플릿을 이용한 자료형에 의존적이지 않은 인라인 함수 */
//template <typename T>
//inline T Square(T x)
//{
//	return x * x;
//}

int main(void)
{
	//cout << SQUARE(5) << endl;	// Macro
	//cout << Square(5) << endl;	// Function
	//cout << Square(5) << endl;	// Inline Function
	//cout << Square(5) << endl;	//Non-dependecies data-type inline function

	return 0;
}

/*
* 함수 호출시 별도로 분리된 위치의 레이블로 점프하여 실행되는 일반 함수와 달리
* 호출 부분을 함수 전체 코드로 치환하여 컴파일 한다.
* 전처리기의 매크로와 달리 언어 차원에서 지원하기에 일반 함수와 별 다르지 않게 사용할 수 있음
*
* 사용방법은 무척 간단한데, inline 함수 선언시 붙여주면 됨.
* 다만 이것은 컴파일러에게 주는 힌트일뿐 항상 인라이닝을 보장하지 않음
*
* 인라이닝의 성능상 의의
* 
* 인라인의 진짜 가치는 함수 호출 비용을 제거하는 데에 있는 것이 아니라,
* 인라인 이후 추가적으로 이루어지는 최적화를 가능하게 만드는 것에 있음
* 이를테면 두 개의 정수를 받아 더하는 add 함수가 있다고 할 때, add(0, 1)은 누가 봐도 1로 치환 가능하지만
* 인라인 이전까지는 컴파일러가 이에 대해 알 도리가 없다.
* 실세계에서는 STL의 사용이 좋은 사례로, 코드를 보면 몇 단계에 걸친 함수 호출이 이루어지지만
* 실제 어셈블리를 보면 불필요한 로직이 전부 삭제되고 꼭 필요한 명령어 몇개만 남는 것을 볼 수 있다.
*
* 인라인 함수는 프로그램의 실행 속도를 높이기 위해 추가된 기능이며 C 언어의 매크로 함수와 비교됨
* (개발자의 입장에서) 일반함수와 인라인 함수의 가장 큰 차이점은 함수의 호출 방식
*
* 일반 함수의 호출 방법은 프로그램 실행 중 함수를 실행해야만 해당 함수의 주소로 점프시켰다가,
* 함수의 처리가 종결되면서 다시 원래의 자리로 돌아오는 것임.
* 이렇게 앞 뒤로 점프를 수행하고 점프할 위치를 기억하려면 함수를 사용하는데 시간이 많이 걸림.

* 인라인 함수는 컴파일된 함수 코드가 프로그램의 코드 안에 직접 삽입되어짐
* 이말은 컴파일러가 함수를 호출하는 대신, 그에 대응하는 함수 코드로 대체한다는 것을 의미하며
* 함수 호출 없이 삽입된 함수 코드를 그 자리에서 처리하므로 해당 함수를 수행하기 위해 프로그램이
* 다른 주소로 점프했다가 되돌아 올 필요가 없어 속도면에서 유리하다.

* 특징:
* - 인라인 함수를 사용하려면 함수 선언 앞에 inline이라는 키워드를 붙이거나 함수 정의 앞에 inline이라는 키워드를 붙임
* - 클래스 멤버함수가 inline 을 사용하려면 함수 정의의 위치가 *.h에 있어야 함. 안그러면 확인할 수 없는 외부 참조라고 뜸
* - 프로그래머가 inline 선언을 해도 컴파일러가 인라인화를 거부할 수 있음
* - 프로그래머가 inline 선언을 안해도 컴파일러가 인라인화를 할 수 있음
* - 함수의 덩치가 크거나 recursive 이면 inline 요구를 거절하는 컴파일러도 있음
* - 함수 코드의 수행시간이 짧고 빈번하게 호출되는 함수가 아니라면, 인라인 함수로 인한 절대적인 시간 절약은 그다지 크지 않음.
*
* 장점:
* - 함수가 인라인화 되어 성능의 향상으로 이어질 수 있음
* 
* 단점:
* - 메모리 사용 측면에서는 인라인 함수가 일반 함수보다 불리하다.
* 이유는 어떤 프로그램에서 인라인 함수를 열번 호출한다면, 프로그램은 그 함수의 사본을
* 프로그램의 코드 안에 열번이나 삽입해야 하기 때문이다.
* - 매크로 함수와 달리 자료형에 독립적이지 못하나 템플릿을 이용하면 자료형에 독립적으로 사용할 수 있음
*/
728x90
반응형

'Language > C & C++' 카테고리의 다른 글

[C++] Related to Bool datatype  (0) 2022.10.17
[C++] Related to Namespace  (0) 2022.10.17
[C++] Related to Reference  (0) 2022.10.17
[C] Related to Preprocessor  (0) 2022.10.17
Exception handling  (0) 2022.10.14

+ Recent posts