
👋 들어가기 전
이번시간은 @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 | ❌ | ✅ | 모듈 간 인라이닝 허용 내부 구현이 공개되기 때문에 주의 |
'Programing Langauge > swift' 카테고리의 다른 글
Mirror (0) | 2025.03.19 |
---|---|
@frozen (0) | 2025.03.18 |
lazy (0) | 2025.02.04 |
Dynamic Key decoding (2) | 2024.12.21 |
GC vs ARC (1) | 2024.12.13 |