Home [C++] 인라인(inline) 함수
Post
Cancel

[C++] 인라인(inline) 함수

인라인(inline) 함수에 대한 기본적인 이론을 설명하고 있습니다.

__forceinline 같은 키워드는 고려하지 않았으니 참고 부탁 드립니다.

함수를 호출하면 함수 호출에 대한 오버헤드가 발생합니다.

매개변수 값들을 복사하거나 제어 흐름 변경에 따른 함수 선언 위치를 기억하기 위한 메모리 사용이라든지 코드에서는 보이지 않는 비용들이 들어가게 되기 때문입니다.

이를 해결하기 위해서 길이가 짧고 단순한 함수에 대해서 매크로 함수를 사용하곤 했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
#define MULTI(A, B) ((A)*(B))


int main() 
{
	int a = 10;
	int b = 10;
	int result = MULTI(a, b);

	std::cout << result << std::endl;
}

// 출력 결과
100

매크로 함수를 사용하는 경우 문제가 몇 가지 있습니다.

  • 함수는 아니기 때문에 자료형을 지정할 수 없다.
  • 논리적인 오류를 발생시킬 확률이 높다.

그렇기 때문에 사용하기가 까다로운데 이를 해결하기 위한 방법으로 인라인(inline) 함수를 사용할 수 있습니다.

인라인(inline) 함수

인라인 함수는 특징은 아래와 같습니다.

  • 매크로 함수와 다르게 일반 함수와 동일함으로 자료형을 지정할 수 있고 논리적 오류를 발생시킬 확률도 낮습니다.
  • 인라인 함수는 매크로처럼 함수 호출이 일어나지 않습니다.

사용 방법은 매우 간단한데 함수 앞에 inline 키워드를 작성해 주면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>

// 인라인 함수
inline int Multi(int a, int b)
{
	return a * b;
}

int main() 
{
    int a = 10;
    int b = 10;
    int result = Multi(a, b);

    std::cout << result << std::endl;
}

// 출력 결과
100

함수 호출로 인한 오버헤드가 없어짐으로 인라인 함수는 너무나 완벽한 함수라고 볼 수 있습니다.

하지만 왜 우리는 모든 함수를 인라인 함수로 사용하지 않는 것일까요??

이건 인라인 함수가 실제로 적용되는 원리를 알면 이해할 수 있습니다.

인라인 함수의 주의점

인라인 함수는 실제로 적용되는 모습은 아래와 같습니다.

적용 모습을 간단하게 설명한 것임으로 실제 적용되는 처리 방식은 다를 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>

inline int Multi(int a, int b)
{
    return a * b;
}

int main() 
{
    int a = 10;
    int b = 10;
    // int result = Multi(a, b);
    int result = 10 * 10; // 인라인 함수의 본문을 그대로 표기해줍니다.

    std::cout << result << std::endl;
}

즉, 함수의 본문을 호출 부분에 그대로 적용한 것인데요.

그렇기 때문에

인라인 함수 본문이 너무 길거나 자주 호출된다면 코드 전체 길이가 길어지게 되고 길어진 만큼 컴파일 시간 및 실행 파일의 크기 또한 늘어나게 됩니다.

그러므로 getter() setter()와 같이 짧고 간단한 함수에 사용하는 것이 바람직합니다.

함수를 인라인으로 써야 하는지는 어떻게 구분하나요?

그럼 인라인 함수를 언제 써야 하는지에 대해 의문점이 들기 시작합니다.

왜냐하면 인라인 함수로 사용할 수 있는 적정 길이가 무엇인지 정확히 알 수가 없기 때문인데요.

물론 컴파일러에 의해 구분되다 보니 컴파일러를 살펴본다면 알 수 있을 겁니다.

이를 알듯이 인라인 함수에 대해서는 컴파일러가 어느 정도 알아서 처리하게 되어 있습니다.

  • 일반 함수에 대해서 인라인 처리가 효율적이라고 판단하면 인라인 함수로 처리합니다.
  • 인라인 함수에 대해서 인라인 처리가 비효율적이라고 판단하면 일반 함수로 처리합니다.

즉, inline 함수를 언제 써야 할지는 컴파일러가 결정하기 때문에 개발자가 어떻게 사용할지 결정하지 않아도 됩니다.

물론
__forceinline 키워드 같이 컴파일러를 무시하고 무조건 인라인 되게 처리할 수도 있습니다.

This post is licensed under CC BY 4.0 by the author.

[C++] 템플릿과 템플릿 특수화

[C++] default 와 delete 예약어