4.4.2 Inline

4.4.2 Inline

인라인 함수(Inline functions)

inline 키워드는 함수 본문을 호출 위치에 직접 삽입할 수 있게 해요. 이는 강력한 최적화 도구가 될 수 있지만, 모든 함수가 인라인 동작에 좋은 후보는 아니므로 신중하게 사용해야 합니다. 다음 예제는 기본 사용법을 보여줘요:

class Main {
  static inline function mid(s1:Int, s2:Int) {
    return (s1 + s2) / 2;
  }

  static public function main() {
    var a = 1;
    var b = 2;
    var c = mid(a, b);
  }
}

생성된 JavaScript 출력이 inline의 효과를 드러냅니다:

(function () { "use strict";
var Main = function() { }
Main.main = function() {
    var a = 1;
    var b = 2;
    var c = (a + b) / 2;
}
Main.main();
})();

분명히 mid 필드의 함수 본문 (s1 + s2) / 2mid(a, b) 호출 위치에 생성되었고, s1as2b로 치환되었어요. 이는 함수 호출을 피하는데, 대상과 발생 빈도에 따라 눈에 띄는 성능 개선을 만들 수 있습니다.

함수가 inline 자격이 있는지 판단하는 것은 항상 쉬운 일이 아니에요. 쓰기 표현식(= 할당 같은)이 없는 짧은 함수가 보통 좋은 선택이지만, 더 복잡한 함수도 후보가 될 수 있어요. 하지만 어떤 경우에는 인라이닝이 오히려 성능에 해로울 수 있는데, 예를 들어 컴파일러가 복잡한 표현식을 위해 임시 변수를 만들어야 하기 때문입니다.

Inline은 보장되지 않아요. 컴파일러는 여러 이유로 인라이닝을 취소할 수 있고, 사용자가 --no-inline 명령줄 인자로 인라이닝을 비활성화할 수도 있어요. 유일한 예외는 클래스가 extern이거나 클래스 필드가 extern 접근 수정자를 갖는 경우인데, 이때는 inline이 강제됩니다. 인라인할 수 없다면(예를 들어 표현식이 루프나 try/catch를 포함하는 등의 이유로) 컴파일 오류가 발생해요. 보통 inline 후보로 적합하지 않은 함수는 오류가 아니라 경고를 내지만, extern(inline 강제)의 경우에는 오류가 납니다.

출처: Inline

본문

인라인의 기본

inline은 함수 본문을 호출 위치에 직접 삽입해 함수 호출 오버헤드를 없앱니다. 예제에서 mid(a, b) 호출이 (a + b) / 2로 치환됩니다.

인라인 판단

쓰기 표현식이 없는 짧은 함수가 좋은 후보예요. 복잡한 함수도 가능하지만, 임시 변수 생성으로 오히려 성능이 나빠질 수 있어요.

인라인 보장 없음

컴파일러가 여러 이유로 인라인을 취소하거나 --no-inline으로 비활성화할 수 있어요. extern이거나 extern 접근 수정자가 있으면 inline이 강제되고, 할 수 없으면 오류가 발생합니다.

더 알아보기