인라인 함수(F#)
인라인 함수는 호출 코드에 직접 통합되는 함수입니다.
인라인 함수 사용
정적 형식 매개 변수를 사용할 때는 형식 매개 변수를 통해 매개 변수화된 모든 함수가 인라인 함수여야 합니다.그래야만 컴파일러에서 이러한 형식 매개 변수를 확인할 수 있습니다.일반적인 제네릭 형식 매개 변수를 사용할 때는 이러한 제한 사항이 적용되지 않습니다.
인라인 함수는 멤버 제약 조건을 사용하는 데 필요할 뿐만 아니라 코드를 최적화하는 데도 유용하게 사용될 수 있습니다.그러나 인라인 함수를 지나치게 자주 사용하면 코드가 컴파일러 최적화에 따른 변경의 영향을 많이 받거나 라이브러리 함수 구현이 어려울 수 있습니다.따라서 다른 최적화 기술을 모두 시도했음에도 불구하고 원하는 수준의 최적화를 얻지 못한 경우가 아니면 인라인 함수의 사용을 자제하는 것이 좋습니다.함수나 메서드를 인라인으로 만들어 성능이 향상되는 경우도 있지만 언제나 성능 향상이 보장되는 것은 아닙니다.따라서 성능 측정도 함께 수행하여 특정 함수를 인라인으로 처리했을 때 성능에서 실제로 긍정적인 효과가 나타나는지 확인해야 합니다.
inline 한정자를 최상위 수준이나 모듈 수준 또는 클래스의 메서드 수준에서 함수에 적용할 수 있습니다.
다음 코드 예제에서는 최상위 수준의 인라인 함수, 인라인 인스턴스 메서드 및 인라인 정적 메서드를 보여 줍니다.
let inline increment x = x + 1
type WrapInt32() =
member inline this.incrementByOne(x) = x + 1
static member inline Increment(x) = x + 1
인라인 함수와 형식 유추
inline이 있으면 형식 유추가 영향을 받습니다.인라인 함수는 정적으로 확인된 형식 매개 변수를 가질 수 있는 반면 인라인이 아닌 함수는 그렇지 못하기 때문입니다.다음 코드 예제에서는 정적으로 확인된 형식 매개 변수가 있는 함수인 float 변환 연산자를 사용하기 때문에 inline이 도움이 되는 경우를 보여 줍니다.
let inline printAsFloatingPoint number =
printfn "%f" (float number)
inline 한정자가 없으면 형식 유추를 통해 함수가 특정 형식(이 예제의 경우 int)을 취하는 것으로 간주됩니다.그러나 inline 한정자가 있으면 함수가 정적으로 확인된 형식 매개 변수도 가지는 것으로 유추됩니다.inline 한정자가 있으면 형식이 다음과 같이 유추됩니다.
^a -> unit when ^a : (static member op_Explicit : ^a -> float)
즉, float로 변환할 수 있는 형식이면 무엇이든 이 함수에 사용할 수 있습니다.