C99에서 생겨난 'inline 함수'는 쉽게 말해 함수 호출에 의한 오버헤드가 없는 함수입니다. 

간단한 예제를 살펴보겠습니다.

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

void main() {
    int val = Add(10, 20);
}

위의 예제에서 Add()는정말 간단한 기능을 하는 함수입니다. 다들 알고있다시피, 함수를 호출하기 위해선 비용이 발생합니다. 여기서 말하는 비용이란 함수에 대한 스택 프레임을 새로 만들고 바로 전에 있는 스택 프레임에 대한 데이터를 레지스터에 백업해야하는 등의 일입니다. 함수가 제공하는 기능에 비해 함수를 호출하는데 드는 비용이 상대적으로 더 큰, 배보다 배꼽이 더 큰 경우가 되어버립니다. 초창기 이것의 대안으로 생각해낸게 '매크로 함수'입니다. 하지만, '매크로'는 애초에 함수의 대안으로 만든 것이 아니기 때문에 몇 가지 문제가 발생하게됩니다.

 

'매크로 함수'의 문제점은 다음과 같습니다.

첫 번째로, 매개변수의 타입을 지정할 수 없습니다.

두 번째로, 가독성이 좋지 못합니다.

세 번째로, 다양한 논리적 오류가 발생할 여지가 생깁니다.

 

그래서 함수 호출에 대한 오버헤드가 없는 함수를 C99에서 새로 만들었는데, 그게 바로 'inline 함수'입니다.

위의 예제를 'inline 함수'로 수정해보겠습니다.

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

void main() {
    int val = Add(10, 20);
}

기존의 함수 선언 맨 앞에 'inline' 키워드만 적어주면 끝입니다. 정말 간단해서 사용하기 쉽습니다. 이제 해당 Add() 함수는 함수 호출로 인한 오버헤드가 발생하지 않기 때문에 성능상으로 상당한 이득을 취할 수 있게 되었습니다. 하지만, 마냥 좋은 것은 아니고 코드의 길이가 제법 있는 함수를 가지고 'inline'으로 선언해버리면 같은 코드가 기계어에 중복해서 나타날테니 잘 판단해서 사용하여야합니다.

 

하지만, 함수 선언부 앞에 'inline' 키워드를 붙인다고해서 무조건 'inline 함수'가 되는 것은 아니고, 코드 라인을 보고 컴파일러가 판단해서 적절한 것들만 'inline 함수'가 됩니다. 하지만, 코드 라인에 상관없이 'inline'을 강제하는 방법도 있습니다. gcc 컴파일러에서 인라이닝을 강제하는 방법은 다음과 같습니다.

__attribute__((always_inline)) int Add(int a, int b) {
    return a + b;
}

void main() {
    int val = Add(10, 20);
}