인라인 확장

컴퓨팅에서 인라인 확장(inline expansion) 또는 인라이닝(inlining)은 함수를 함수라는 이름의 몸체의 콜 사이트로 대체하는 수동 또는 컴파일러 최적화 기법이다. 인라인 확장은 매크로 확장과 비슷하지만 소스 코드의 변경 없이 컴파일 중에 발생하는 반면, 매크로 확장은 컴파일 전에 발생하며 컴파일러에 의해 처리되는 텍스트 결과물이 다르다.

인라이닝은 중요한 최적화이지만 성능에 복잡한 효력을 발휘한다. 경험 법칙에 의거하여 일부 인라이닝은 매우 사소한 공간적 비용으로 속도를 개선시키지만 과도한 인라이닝은 인라인된 코드에 의해 함수 캐시를 상당 부분 소비하기 때문에 속도가 감소되며 상당한 공간 비용이 발생한다. 인라인에 관한 한정된 학술 논문 조사는 Jones & Marlow 1999를 통해 이루어졌다.

구현 
다음은 C 프로그래밍 언어에서 소스 레벨로 손으로 직접 쓴(수동) 인라인 확장의 예이다:
int pred(int x)
{
    if (x == 0)
        return 0;
    else
        return x - 1;
}

인라이닝 전:
int func(int y)
{
    return pred(y) + pred(0) + pred(y+1);
}

인라이닝 후:
int func(int y)
{
    int tmp;
    if (y   == 0) tmp  = 0; else tmp  = y       - 1; /* (1) */
    if (0   == 0) tmp += 0; else tmp += 0       - 1; /* (2) */
    if (y+1 == 0) tmp += 0; else tmp += (y + 1) - 1; /* (3) */
    return tmp;
}

이것은 단지 예시일 뿐이다. 실제 C 애플리케이션에서는 파라미터를 사용한 매크로나 인라인 함수 등 인라인 언어 기능을 사용함으로써 컴파일러에게 이러한 방식으로 코드를 변환하도록 지시하는 것이 선호된다.

각주

외부 링크 
"Eliminating Virtual Function Calls in C++ Programs" by Gerald Aigner and :en:Urs Hölzle
"Reducing Indirect Function Call Overhead In C++ Programs" by Brad Calder and Dirk Grumwald
ALTO - A Link-Time Optimizer for the DEC Alpha
"Advanced techniques" by John R. Levine
"Inlining Semantics for Subroutines which are Recursive" by Henry G. Baker
"Whole Program Optimization with Visual C++ .NET" by Brandon Bray

컴파일러 최적화
함수 (프로그래밍)