관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] @inlinable 이란? 본문

iOS 기본 (swift)

[iOS - swift] @inlinable 이란?

jake-kim 2022. 3. 11. 22:50

인라인의 개념

  • swift에만 있는 기능이 아닌, 일반적으로 프로그래밍 언어에 있는 기능
  • 컴파일러 최적화에서 사용
  • 인라인이란, 메서드 호출을 해당 메서드의 본문으로 대체하는 컴파일러 최적화 방법
    • 일반적인 메소드를 호출하는 작업: 스레드에 있는 스택 테스크(추적, 앱 상태 전송, 저장, 변경)하는 과정이 존재 (장점 - 디버깅 용이, 단점 - 오버헤드)
    • 인라인을 사용한 경우, 메소드 호출: 스택을 따로 추적하지 않고 메소드의 본문을 바로 가져다가 사용 (장점 - 오버헤드 감소, 단점 - 함수 body가 재귀 호출과 같은 반복이 있는 경우에는 더 비효율적)

ex) 인라인의 개념 예제

  • 인라인이 적용되지 않은 것
override func viewDidLoad() {
  super.viewDidLoad()
  self.printPlusOne(number: 1)
}

func printPlusOne(number: Int) {
  print("프린트 시작")
  print("value is \(number + 1)")
  print("프린트 종료")
}
  • 인라인이 적용된다는 의미: 메소드를 호출하는 개념이 아닌, 메소드의 body부분이 호출하는쪽에서 통째로 사용
override func viewDidLoad() {
  super.viewDidLoad()
  print("프린트 시작")
  print("value is \(1 + 1)")
  print("프린트 종료")
}

@inlinable

  • internal, public 접근제한에서만 사용 (private, fileprivate 사용 불가)

https://docs.swift.org/swift-book/ReferenceManual/Attributes.html 

사용하는 케이스

  • 인라인을 사용하면 오버헤드를 줄일 수 있으므로, 구현부가 간단한 메소드인 것들을 인라인으로 설정하여 오버헤드를 낮추어 컴파일러 최적화를 적용 (단 재귀호출 시 사용하면 더 비효율적)

ex) +1을 하여 print하는 메소드

  • 일반적인 메소드
func printPlusOne(number: Int) {
  print("value is \(number + 1)")
}
  • 재귀호출이 없고, body가 단순한 형태이므로 @inlinable 사용하여 컴파일러 최적화
@inlinable
func printPlusOne(number: Int) {
  print("value is \(number + 1)")
}

* 참고

https://github.com/apple/swift-evolution/blob/master/proposals/0193-cross-module-inlining-and-specialization.md

https://swiftrocks.com/understanding-inlinable-in-swift

https://docs.swift.org/swift-book/ReferenceManual/Attributes.html

 

Comments