개발자 면접 공부/C-C++

Inline 에 대하여

chogyujin 2023. 9. 25. 19:37
728x90

1. 개요

오늘은 C++에 inline에 대하여 알아봅시다.


2. Inline?

인라인 함수는 C++ 언어에서 코드의 효율성을 고려하여 만들어진 기능입니다.

인라인 함수를 통해 함수 호출 및 오버헤드를 감소하는 결과를 얻을수 있으며 보통 함수에 내용이 짧을 경우 사용을 합니다.

인라인 함수가 호출되면, 인라인 함수의 전체 코드가 인라인 함수 호출 시점에 삽입되거나 대체됩니다.

 


3. Inline 예시

기본적인 형태로는 아래와 같습니다.

 

inline int sum(int a, int b)
{
	return a + b;
}

 

이 인라인 함수를 어떻게 호출하면 기존 C++처럼 호출하면 됩니다.

#include<iostream>
#include<variant>
using namespace std;

inline int sum(int a, int b)
{
	return a + b;
}

int main()
{
	int result;
	int x = 5;
	int y = 5;
	result = sum(x, y);
	cout << result;
}

이렇게 보면 차이점이 안보이겠지만 inline 함수의 경우, Main()함수 내에 코드가 직접 써져 있는 것과 같은 효과를 얻습니다.

 

즉, 함수 호출을 하기위해 CPU가 메인함수에 내용을 레지스터에서 빼서 스택포인터를 만들고 sum함수를 호출하여 레지스터에 넣는 작업을 줄일수 있습니다.

int main()
{
	int result;
	int x = 5;
	int y = 5;
	{
		int a = x;
		int b = y;
		result = a + b;
	}
	cout << result;
}

이런 형식으로 됩니다.


4. Inline에 장,단점

1. 장점

  • 인라인 함수의 전달인자에 데이터형을 체크할 수 있다.
  • 매크로가 갖는 부작용 없이 일반 함수처럼 사용이 가능하다.
  • 디버깅이 가능하다. 즉, 현재 변수에 어떤 값이 들어가 있는지 알 수 있다.
  • 함수 호출 오버헤드가 발생하지 않는다.
  • 컴파일러가 함수 본문에서 컨텍스트별 최적화(context optimization)를 수행할 수 있다.

2. 단점

  • 실행 코드가 커진다.
  • 인라인 함수의 구현을 짧게 1~3줄 정도의 짧은 코드로 작성한다. (길면 캐시 적중률이 감소한다.)
  • 구현이 길어진다면 컴파일러는 인라인 함수를 일반 함수로 취급하게 된다.
  • 인라인 함수를 자주 사용하면, 같은 코드의 중복으로 바이너리 실행 파일이 커진다.
  • 인라인 함수가 변경된다면, 전체 코드가 그 변경사항을 반영해야 하므로, 컴파일 시간 오버헤드가 발생한다

5. Inline 함수가 무시되는 경우

  • 함수에 루프가 포함되어 있을 때 (for, while, do-while)
  • 함수에 정적 변수들이 있을 때 (static variables)
  • 함수가 재귀호출을 할 때
  • 함수가 switch나 goto문이 포함될 때

6. Inline 함수와 #define 매크로와의 기능 비교

 

#include<iostream>
#include<variant>
using namespace std;

#define SQR(a)a*a

inline int sqr(int a)
{
	return a * a;
}

int main()
{
	int x = 10;
	int result = 0;
	result = SQR(x+3);
	cout << "#define : " << result<<'\n';

	result = sqr(x + 3);
	cout << "inline : " << result;
}

보시면 #define과 inline에 차이가 다릅니다.

실제로 매크로로 치환을 할 경우 10+3 * 10+3 이렇게 치환이 되어 43이 나왔습니다.

하지만 inline 함수는 제대로 x+3을 먼저 계산을 해주는것이 가능합니다.

따라서 매크로는 단순 치환이 되므로 제대로 구하고 싶으면

#include<iostream>
#include<variant>
using namespace std;

#define SQR(a)(a)*(a)

inline int sqr(int a)
{
	return a * a;
}

int main()
{
	int x = 10;
	int result = 0;
	result = SQR(x+3);
	cout << "#define : " << result<<'\n';

	result = sqr(x + 3);
	cout << "inline : " << result;
}

이런 #define 부분에 가로를 넣어 만드는것이 좋습니다.

하지만 매크로는 치환하는중에 부작용은 언제나 존재하니 inline함수를 사용하는것을 추천드립니다.


7. Ref

https://siloam72761.tistory.com/entry/C-%EC%9D%B8%EB%9D%BC%EC%9D%B8-%ED%95%A8%EC%88%98%EC%9D%98-%EC%9E%A5%EB%8B%A8%EC%A0%90-define-%EB%A7%A4%ED%81%AC%EB%A1%9C%EC%99%80-%EC%B0%A8%EC%9D%B4

 

[C++] 인라인 함수의 장단점, #define 매크로와 차이

0. 인라인 함수의 개념 C++ 언어에서 코드의 효율성을 고려하여 만들어진 기능이다. 인라인 함수는 함수 호출 오버헤드를 감소시킨다. 인라인 함수가 호출되면, 인라인 함수의 전체 코드가 인라

siloam72761.tistory.com

https://www.tcpschool.com/cpp/cpp_cppFunction_inlineFunction

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

'개발자 면접 공부 > C-C++' 카테고리의 다른 글

Move Semantics  (0) 2023.10.29
스마트 포인터의 new와 make의 차이  (1) 2023.10.03
C++ 17 variant  (0) 2023.09.19
C++ 17 구조적 바인딩  (2) 2023.09.14
C++ 11 tuple  (0) 2023.09.13