Swift 中的 @inlinable 属性是什么?

What is the @inlinable attribute in Swift?

提问人:yasin89 提问时间:10/30/2023 最后编辑:Alexanderyasin89 更新时间:10/30/2023 访问量:87

问:

我对功能有更多的研究,但找不到任何简单的解释。@inlinable

@inlinable func printPlusOne(_ num: Int) {
    print("My number: \(num + 1)")
}

用法如上所示。

我找到了这个属性的主题,但我无法弄清楚。有人可以解释一下,简化它,这个属性有什么好处吗?

这是我读到的链接主题:https://swiftrocks.com/understanding-inlinable-in-swift

感谢您的回复。

Swift 编译器优化

评论

3赞 Duncan C 10/30/2023
我认为您包含的链接很好地解释了它。@inlinable适用于库和框架的创建者。它允许此类框架的作者将函数标记为能够内联(其中函数的代码被复制到目标中,而不是在框架中进行函数调用。内联可以提高速度,因为函数调用需要时间来设置。
0赞 Duncan C 10/30/2023
底线:并且是高级编译器指令,如果您不明白它们的用途,请不要弄乱它们。这就像调整发动机凸轮轴的轮廓一样。如果你知道自己在做什么,你可以得到性能的提升,但如果你不知道自己在做什么,你也会把事情搞砸。@inline@inlining

答:

0赞 Cœur 10/30/2023 #1

来自 Swift 文档: https://docs.swift.org/swift-book/documentation/the-swift-programming-language/attributes/#inlinable

将此属性应用于函数、方法、计算属性、下标、便利初始值设定项或取消初始值设定项声明,以将该声明的实现公开为模块公共接口的一部分

→ 当你使用它时,人们将能够看到它的源代码。有点像直接在头文件中执行 C++ 实现时。编译器可能会(或不)对此做些什么。

内联代码不能与私有或 fileprivate 符号交互

→ 这是为了强调何时无法使用它。

至于好处,我很想指出 ISO C++ 对其等效关键字(内联)的采用

(在概念上类似于 #define 宏发生的情况)
这可以提高性能,因为优化器可以按程序集成被调用的代码 - 将被调用的代码优化到调用者中。

内联函数会提高性能吗?
是的,也不是。有时。或。
没有简单的答案。 内联函数可能会使代码更快,也可能会使代码更慢。它们可能会使可执行文件变大,也可能使可执行文件变小。它们可能会引起捶打,它们可能会阻止捶打。它们可能而且经常与速度完全无关。