본문 바로가기
C++/기초

C++ 기초 : inline

글: 시플마 2024. 4. 26.

함수를 선언하고 정의를 하기 위해

Ctrl + . 을 통해 정의 부분을 만들면

'inline'이라는 키워드가 붙습니다.

 

이게 무슨 의미일까요?

 

함수 A()

{

  ...

  함수 B();

  ...

}

 

자, 위와 같은 함수가 있습니다.

 

함수 A를 호출하면 쭉 코드가 실행되다가

함수 B 호출 구문을 만나 

Stack 영역에 함수 B를 호출하고

여기서 함수 B를 실행한 뒤 반환하고

다시 함수 A로 돌아와 남은 코드를 실행하고 

함수 A가 종료될 것입니다.

 

근데 만약 함수 B 앞에 inline 키워드를 붙이면

함수 B를 호출했을 때 함수 B로 점프하여 실행하지 않고

함수 A 코드에 함수 B 코드를 붙여넣고 

함수 A를 실행하면서 그대로 실행합니다.

즉 실제로 함수 B를 호출하는 구문이 없다고 봐도 되는 거죠.

 

 

이러한 경우 함수 B 호출 구문을 만나 해당 함수로 점프하는 동작을

하지 않기 때문에 호출 비용이 들지 않는다는 장점이 있습니다.

 

하지만 만약 함수 B의 코드가 엄청 길고

자주 사용된다면 호출될 때마다 함수 B가 붙여넣기되는

꼴이기 때문에 오히려 손해일 수도 있다는 겁니다.

 

그래서 inline 키워드를 붙였다고 해서 

무조건 inline 방식으로 작동하지는 않습니다.

 

inline 키워드를 붙였다고 해도 컴파일러가

판단하기에 inline으로 작동하면 오히려 손해다라고

판단되면 그냥 일반 함수처럼 해당 함수로 점프하여 실행하게 되죠.

 

 

이런 이유로 inline 키워드를 붙이기 좋은 함수는

코드가 짧은데 자주 호출되는 함수입니다. 

 

코드가 짧은 경우, 함수를 호출하고 반환하는

비용보다 그냥 바로 붙여넣어서 사용하는 게

비용이 적게 들기 때문이죠.

 

멤버 변수의 값을 반환하는 Get 함수나

멤버 변수의 값을 세팅하는 Set 함수 등이

inline으로 선언하기 적절하죠.

 

직접 만들었던 함수 중에는

vector를 구현한 cArr 클래스와

list를 구현한 cList 클래스의

begin, end 함수가 있겠네요.

 

 


 

 

원래 헤더 파일에 함수의 선언과 정의를

모두 작성해 놓고 다양한 소스 파일에서

해당 헤더 파일을 include 지시문을 통해

포함시키면 오류가 발생하죠.

 

이유는 헤더 파일을 포함시키는 순간

헤더 파일에 코드들이 소스 파일에 복사가 되기 때문에 

함수의 정의가 여러 소스 파일에 복사가 되겠죠?

 

그래서 중복 정의 문제가 발생합니다. 

똑같은 함수가 여러 개가 되는 거죠.

 

하지만 클래스의 멤버 함수는 그렇지 않습니다.

 

헤더 파일에 멤버 함수의 정의와 선언을 모두 하면

inline 함수라고 인지할 뿐이죠.

 

 

vector를 구현한 cArr 클래스와

list를 구현한 cList 클래스의 경우 

클래스 템플릿으로 구성하였기 때문에 

헤더 파일에 함수의 선언과 정의를 모두 입력했죠.

(클래스 템플릿은 자료형을 입력받고 해당 자료형에 맞는

클래스를 생성하기 위한 것입니다. 선언과 정의를 따로 한 후

클래스를 생성하려고 하면 자료형에 따른 선언만 생성이 되고

정의는 생성되지 않아 링크 과정에서 오류가 납니다.

그래서 헤더 파일에 선언과 정의를 모두 했었죠?)

 

이렇게 헤더 파일에 함수의 선언과 정의를 모두 한 경우

해당 함수는 모두 inline 함수가 되는 겁니다.

 

 

 

 

강의 출처 : https://www.youtube.com/watch?v=PFc4g8mxOiI&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&pp=iAQB


 

'C++ > 기초' 카테고리의 다른 글

C++ 기초 : tree (2)  (0) 2024.04.26
C++ 기초 : tree (1)  (0) 2024.04.26
C++ 기초 : list iterator  (0) 2024.04.25
C++ 기초 : erase (2)  (0) 2024.04.24
C++ 기초 : erase (1)  (0) 2024.04.24