函数内联# (Inline Function) 是一种编译器优化技术,它通过使用方法的内容替换直接调用该方法,从而优化性能。
1、OC项目的内联优化
int sum(int a, int b) {
return a + b;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
int a = sum(1,2);
NSLog(@"%d",a);
}
return 0;
}
在没有进行任何优化的情况下,跑个汇编调试:
- 会将1和2分别存入寄存器,然后再调用sum函数。
最快最小优化-Fastest,Smallest
再次进行汇编调试:
优化后的代码,直接略过计算过程,直接将计算结果存入寄存器,然后调用NSLog打印。
2、Swift项目的内联优化
Swift中的内联函数是默认行为,无需执行任何操作. Swift编译器会自动内联函数作为优化。
// 编译器会认为 test 没有太多意义,会省略test的符号调用,直接调用print
func test() {
print("test");
}
- always - 将确保始终内联函数。通过在函数前添加
@inline(__always)来实现此行为 - never - 将确保永远不会内联函数。这可以通过在函数前添加
@inline(never)来实现。 - 如果函数很⻓并且想避免增加代码段大小,请使用
@inline(never)
3、private的优化操作
如果对象只在声明的文件中可⻅,可以用 private 或 fileprivate 进行修饰。编译器会对 private 或 fileprivate 对象进行检查,确保没有其他继承关系的情形下,自动打上 final 标记,进而使得对象获得静态派发的特性(fileprivate: 只允许在定义的源文件中访问,private : 定义的声明中访问)
class CCTPerson {
private var sex: Bool
func changeSex() {
self.sex = !self.sex
}
init(sex innerSex: Bool) {
self.sex = innerSex
}
func test() {
self.changeSex()
}
}
let p = CCTPerson(sex: true)
p.test()
changeSex()是地址调用,没有使用函数表派发。