본문 바로가기

BSMath

현대 컴파일러에서의 inline 함수

inline 키워드는 inlining과 관련이 없다

 일단 inline의 정의부터 확실히 하자. inline은 컴파일러에게 해당 함수의 inlining을 요청하는 함수이다. 강요가 아니다. 그렇기에 __forceinline 등의 inlining을 강요하는 키워드가 있다. 그러나 요즘의 컴파일러는 똑똑해서 자체적으로 inlining 여부를 판단한다. 즉 inline 키워드는 inlining과 관련이 없다.

 

inline 키워드의 의의

 그럼 inline 키워드는 쓸 이유가 없을까? 그건 아니다. inline 키워드는 해당 함수가 ODR을 무시하게 만들어준다. ODR은 One Definition Rule의 약자로, 객체나 함수의 정의는 유일해야한다.라는 규칙이다. 이 때문에 선언은 헤더에, 정의는 cpp 파일에 두는 것이기도 하다. 그러나 인라인 함수는 헤더 파일에 정의가 있기에 정의가 여러개 존재하게 된다. 그래서 inline 함수는 ODR을 무시하게 되는 것이다. 이 것은 inline 키워드를 붙였으나, inlining 되지 못한 함수 역시 마찬가지이다. 즉 현대 컴파일러에서 inline 키워드의 주 의의는 ODR의 무시인 것이다.

 

의미가 다른 키워드는 의미가 있는가

 inline 키워드가 inlining을 위해서가 아니라 ODR을 무시하기 위하다는 것을 알았다. 그러나 inline과 관련이 없는데 inline 키워드를 이용하는 것이 의미가 있을까? 정말 가독성을 해치는 행위이다. 그래서 매크로를 활용해서 가독성을 높였다. 아래 코드처럼 매크로를 선언하여 전역 함수에 NO_ODR을 선언하면 내부적으로 inline 키워드로 치환하여 ODR을 무시하게 된다. 그리고 해당 키워드를 붙인 의미 역시 코드를 통해 설명이 가능하다.

 

#define NO_ODR inline