XCode函数内联-编译优化

592 阅读2分钟

函数内联# (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;
}

iShot2022-02-07 11.47.04.png

在没有进行任何优化的情况下,跑个汇编调试: iShot2022-02-07 11.10.02.png

  • 会将1和2分别存入寄存器,然后再调用sum函数。

最快最小优化-Fastest,Smallest

iShot2022-02-07 11.55.33.png

再次进行汇编调试:

iShot2022-02-07 11.58.31.png

优化后的代码,直接略过计算过程,直接将计算结果存入寄存器,然后调用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()是地址调用,没有使用函数表派发。