본문 바로가기
프로그래밍 언어/C++

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

by 까망 하르방 2022. 8. 6.
반응형

키워드 inline」 로 정의된 함수를 "인라인 함수"라 한다.

보통, 구조가 간단한 함수를 inline 처리해야 효율성을 높일 수 있다. 

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

 

클래스 또는 구조체 안에

멤버함수 정의부를 두면 자동 인라인 함수화한다.

 

소스코드를 .h와 .cpp로 분리하는 경우

컴파일시간에  인라인함수 코드가

확장될 수 있도록 함수 정의부는 헤더파일에 둔다.

(함수가 호출될 때 읽히기 때문에 미리 읽도록 처리)

 

 

A.h

class A
{
  int res;

public:
  inline int add(int a, int b);
  void print(void);
};

inline int A::add(int a, int b)
{
  res = a + b;
  return res;
}

 

A.cpp

#include <iostream>

using namespace std;

#include "A.h“

void A::print(void)
{
  cout << res << endl;
}

 

함수 호출/복귀 비용(prefix, suffix code)을 줄일 수 있으나

너무 많은 inline 함수는 프로그램 부피가 커지게 할 수 있다.


 

인라인 함수화 유의사항

• 재귀 함수는 컴파일러 설정에 따라 정의된 호출 Depth까지 호출된다.

  그렇지 않은 경우 코드 길이가 커질 수 있다.

// MS compiler options
#pragma inline_recursion(on)
#pragma inline_depth(16) // 최대 16 Depth

 

가변인수 함수 인라인화 할 수 없다.

    → 컴파일 시간에 파라미터 개수를 파악할 수 없기 때문이다.

• 함수 포인터로 함수 호출하는 경우 인라인화 불가 (동적 바인딩)

* 인라인 함수 사용을 위한 컴파일러 옵션 확인하면 좋다.


 

인라인 함수 vs 매크로 함수

C 언어에서는 매크로 함수로 실행속도 성능을 어느정도 확보할 수 있다.

📌 [C] [전처리기] 매크로와 선행처리기

하지만 매크로 함수는 복잡한 형태를 정의하기에는 한계가 있다.

 

[C] [전처리기] 매크로와 선행처리기

매크로와 선행처리기 실행파일이 컴파일과 링크의 과정을 거치는데 컴파일 이전에 선행처리 과정을 거친다. ▶ 선행처리 → 컴파일 → 오브젝트 파일 → 링크 → 실행 파일 ※ 컴파일 과정

zoosso.tistory.com

 

매크로는 전처리기에서 처리되지만

inline 키워드는 컴파일러에서 처리된다.

 

컴파일러는 인라인화가 성능 저하를 유발한다고 판단될 때

inline 키워드를 무시하기도 하다.

반대로 컴파일러는 필요에 따라서는 임의로 인라인화 시키기도 한다.

 

매크로 함수는 자료형에 의존하지 않는다.

#define SQUARE(X) ((X)*(X))

std::cout << SQUARE(12); // int 형
std::cout << SQUARE(3.15); // double 형

 

물론, 인라임 함수도 오버로딩(Overloading)으로 여러 데이터 타입을 정의할 수 있지만

필요한 타입 만큼 함수 개수가 늘어나게 된다.

 

그래서 C++에서는 템플릿(Template)으로 자료형에 의존하지 않을 수도 있다.

(한편으로 컴파일 시간에 올바른 인수 타입 검사가 필요하기도 하다.)

template <typename T>
inline T SQUARE(T val)
{
    return val * val;
}
 

💻 함수 오버로딩(Overloading)

함수 오버로딩 (overloading) • 동일한 이름의 함수명이 여러개 중복 정의되어 있는 형태 • 함수 파라미터(parameter) 자료형 혹은 개수가 다르다. • C 언어에서는 동일한 이름의 함수 정의를 허용

zoosso.tistory.com

반응형

댓글