内联函数
如果开启了编译器优化(Release模式默认会开启优化),编译器会自动将某些函数变成内联函数.即将函数调用展开为函数体.
开启了编译器优化路径:
image.png
- 函数体比较长
- 包含递归调用
- 包含动态派发
以上这些情况比编译器不会自动内联
//永远不会被内联(即使开启了编译器优化)
@inline(never) func test() {
print("1")
}
//开启编译器优化后.即使代码很长,也会被内联(递归调用函数,动态派发的函数除外)
@inline(__always) func test() {
print("1")
}
在Release
模式下,编译器已经开启优化,会自动决定那些函数需要内联,因此没必要使用@inline
输入输出参数(In - Out Parameter)
- 可变参数不能标记为
inout
-
inout
参数不能有默认值 -
inout
参数只能传入可以被多次赋值的(不能是 let)
func swapValues(_ v1: inout Int,_ v2: inout Int) {
(v1,v2) = (v2,v1)
}
var num1 = 1
var num2 = 1
swapValues(&num1, &num2)
- 上述代码中的
inout
参数的本质是地址传递(引用传递) - 如果传递给
inout
参数的是计算属性,有监听属性等内容,其本质是非引用传递.
网友评论