Hamp 2025. 3. 18. 22:20
반응형

👋 들어가기 전

이번시간은 @inlinable이다.

 

생각보다 조금 어려운 개념이 있으니 차근차근 살펴보자.


✊없다면 ?

우리는 보통 메서드를 호출할 때 스택에 현재 상태를 보내고 상태를 저장하고

다시 돌아오는 등 다양한 오버헤드가 존재한다.


☝️@inlinable

역할

말 그대로 위에서 설명한 오버헤드를 줄이기위해 호출하는 쪽에
메서드 내용 전체를 삽입한다.

사용 영역

  • 함수
  • 메서드
  • 계산 프로퍼티
  • subscript
  • 생성자

장점

  • 오버헤드를 낮춰 컴파일러 최적화 가능
  • 모듈 경계를 넘어 사용 가능

단점

  • 구현 내용이 공개됨
  • 코드 크기가 증가
  • 재귀 함수에서는 오히려 비효율적
  • internal, public만 사용 가능

✌️@usableFromInline

전체적인 느낌은 위에 @inlineable과 동일하다

 

차이점만 간단하게 명시한다.

  • 동일한 모듈 내에 있는 internal 선언에 사용
  • class, struct, enum 까지도 사용이 가능 (위 사용영역까지 포함)
  • 오직 internal 선언과 같이 사용

👍 @inline(__always)와 @inline(never)

1. @inline(__always)

  • 항상 인라인되도록 강제
  • 컴파일러가 최적화를 수행할 때 무조건 해당 함수를 인라인

2. @inline(never)

  • 절대 인라인되지 않도록 강제
  • 코드 크기가 증가하는 것을 방지하고, 함수 호출이 유지되도록

예제

@inline(__always)
func add(_ a: Int, _ b: Int) -> Int {
    return a + b
}

let result = add(3, 5)  // 컴파일 시 add() 함수의 본문이 직접 삽입됨

@inline(never)
func expensiveCalculation(_ x: Int) -> Int {
    return (x * x * x) - (x * 2) + 10
}

let output = expensiveCalculation(10)  // 이 함수는 인라인되지 않음

@inlinable과 @inline 차이

  인라이닝 강제 여부 외부 모듈 사용 가능 여부 사용 목적
@inline(__always) 특정 코드 최적화
@inlinable 모듈 간 인라이닝 허용

내부 구현이 공개되기
때문에 주의

 

반응형