티스토리 뷰

반응형

Swift Docs > Attribute 를 보면,

Swift의 inline 관련 attribute 로 inlinableusableFromInline 가 있습니다. 

 

[1] inline 한정자란? 

 

우선 이펙티브 코틀린 책 내용을 통해 inline 개념을 먼저 알아봅시다! 


inline 한정자의 역할은 컴파일 시점에 '함수를 호출하는 부분'을  '함수의 본문' 으로 대체하는 것입니다. 

일반적인 함수를 호출하면 함수 분문으로 점프하고, 본문의 모든 문장을 호출한 뒤에 함수를 호출했던 위치로 다시 점프하는 과정을 거칩니다.

하지만 inline 한정자를 붙여 함수를 만드면, 이러한 점프가 일어나지 않습니다. 

 

 

# 장점

모든 함수는 inline 한정자를 붙이면 조금 더 빠르게 동작합니다. 

함수 호출과 리턴을 위해 점프하는 과정과 백스택을 추적하는 과정이 없기 때문입니다. 

 

 

# 단점(비용)

 

1) inline 한정자는 모든 곳에 사용할 수 없습니다.

- 인라인 함수는 재귀적으로 동작할 수 없음. (재귀적으로 사용하면, 무한하게 대체되는 문제가 발생)

- public 인라인 함수 내부에서는 private, internal 가시성을 가진 함수와 프로퍼티를 사용할 수 없음.

 

 ➡️ 이 부분은 아래 설명하지만,,  Swift에서는 같은 모듈 내에 있고 usableFromInline attributite가 붙은 
       internal 함수라면 public 인라인 함수 내부에서 사용가능합니다. 

@inlinable public func printSomething() {
    printHello()
}


@usableFromInline func printHello() {
    print("안녕!")
}

 

 

2) inline 한정자를 남용하면, 코드의 크기가 쉽게 커집니다. 특히 한 인라인 함수가 다른 인라인 함수를 호출하는 경우, 코드가 기하급수적으로 증가하므로 주의해야합니다. 


 

이제 Swift Attribute인 inlinable과 usableFromInline 를 알아봅시다! 

 

 

[2] inlinable

- 이 attribute를 선언해서 해당 선언의 구현을 모듈의 public interface의 일부로 노출시킬 수 있습니다. 

- function, method, computed property, subscript, convenience initializer, or deinitializer 에 선언가능합니다. 

 

 

- inlinable 코드는 어떤 모듈에 선언되어있든 public 선언과 함께 쓸 수 있으며

usableFromInline attribute가 표시된 동일한 모듈에 있는 internal 선언과도 함께 쓸 수 있습니다. 
private, fileprivate 과는 함께 쓸 수 없습니다.

 

 

- 함수 내부에 선언된 nested function의 선언에 inlinable을 함께 쓸 수 없습니다. 

 

 - inlinable function 안에 선언된 function, closure는 inlinable attribute를 안붙여도 implicitly inlinable 입니다. 

 

 

[3] usableFromInline

- 이 attribute를 선언해서 동일한 모듈 내에 있는 internal 선언이 inlinable code로 사용될 수 있게 합니다. 

- 이 attribute는 오직 internal 선언과 같이 사용가능합니다. 

 

 

- function, method, computed property, subscript, initializer, or deinitializer 에 선언가능합니다. (inlinable과 동일)

 

 

- 그리고 class, structure, enumeration 과도 함께 사용할 수 있는데요 (inlinable 과 다름)

 

 > 이 attribute를 선언한 structure와 class는 public 또는 usableFromInline 으로 선언된 프로퍼티를 가져야합니다. 

 > 이 attribute를 선언한 enumeration 은 public 또는 usableFromInline 으로 선언된 raw values 와 associated values 를 가져야합니다. 

 

 

아래가 문서에 나오는 원글인데요,,,  only 라고 적혀있는데,,, 

A structure or class marked usableFromInline can use only types that are public or usableFromInline for its properties. An enumeration marked usableFromInline can use only types that are public or usableFromInline for the raw values and associated values of its cases.

 

only가 아닌 접근제한자를 넣어도 컴파일 에러는 안나더라구요;;;; 

 

 

 

 

물론 inlinable 함수에서는 @usableFromInline 랑 public이 붙은 프로퍼티들만 접근이 가능하긴 합니다!! 

 

 

 

[4] 사용사례

1. 

 

[iOS - swift] @inlinable 이란? 글에서 소개된 예제처럼  간단하게 print 함수의 경우에도 활용할 수 있을 것 같구요

 

 

2.

SE-0193: Cross-module inlining and specialization 를 보면 

 

We propose introducing a pair of new attributes, @inlinable and @usableFromInline. The @inlinable attribute exports the body of a function as part of a module's interface, making it available to the optimizer when referenced from other modules. The @usableFromInlineattribute marks an internal declaration as being part of the binary interface of a module, allowing it to be used from @inlinable code without exposing it as part of the module's source interface.

 

Swift에서는 모듈 간의 참조에 대한 컴파일러 최적화를 위해 만들었다고 명시하고 있네요. 

 

[번역][WWDC][Xcode] Binary Frameworks in Swift 살짝 정리 - XCFramework  글 중에 해당 내용 캡쳐했습니다!

 

http://minsone.github.io/ios/mac/ios-wwdc-2019-binary-frameworks-in-swift-little-summary-and-translate

 

http://minsone.github.io/ios/mac/ios-wwdc-2019-binary-frameworks-in-swift-little-summary-and-translate

 

 

 

참고로 이펙티브 코틀린 책에서는 inline의 좋은 사용사례로 inline 클래스를 소개한다. (이펙티브 코틀린 p330)

코틀린은 함수 뿐만 아니라 클래스 앞에 inline을 붙일 수 있다. 

인라인 클래스를 사용해서 성능적인 오버헤드 없이 타입을 래핑할 수 있다. 인라인 클래스를 활용해서 의미가 명확하지 않은 타입이거나 여러 측정단위들을 함께 사용하는 경우, 실수로 코드를 잘못 작성하는 것을 막을 수 있는 것이다. 

 

인라인 클래스 말고 인터페이스, typealis 라는 대안이 있다. 

하지만 인터페이스를 통해 타입을 나타내면 객체를 래핑해서 사용해야하고

tyealias 는 이름이 명확하므로 안전할 거라는 착각을 하게 하지만, 오류를 발생시키지 않기 때문에 여전히 실수를 할 여지를 남긴다. 

 

 

==> Swift에서는 class나 struct에 @inlinable을 붙일 수 없기 때문에 해당사항은 아니나 책읽다가 참고용으로 기록. 

 

 

 

 

 

 

 

반응형
댓글