工作生活

iOS OC中内联函数inline

2019-07-02  本文已影响0人  oc123

inline

在iOS中的一些框架中,static inline是经常出现的关键字组合。

(如果你在看框架时,看到inline不解,搜索到这篇文章,看到这里可以不用看下面的详述了。)

static inline CGFloat CGFloatFromPixel(CGFloat value) {
    return value / YYScreenScale();
}

//YYScreenScale()方法说明:
CGFloat YYScreenScale() {
    static CGFloat scale;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        scale = [UIScreen mainScreen].scale;
    });
    return scale;
}

虽然static inline修饰的是函数(或者方法,swift出来后,我觉着方法==函数,朋友们不用咬文嚼字,鄙视我辈了)。但它在这里就是宏的作用,即你可以将CGFloatFromPixel当作一个宏。
当然inline函数有区别,inline可以:

(1)将下一条指令的所在地址入栈。
(2)并将子程序的起始地址送入PC(于是CPU的下一条指令就会转去执行子程序)。

结论

为什么inline能取代宏?
优点相比于函数:

1、inline函数避免了普通函数的,在汇编时必须调用call的缺点:取消了函数的参数压栈,减少了调用的开销,提高效率。所以执行速度确比一般函数的执行速度要快。
2、集成了宏的优点,使用时直接用代码替换(像宏一样)。

优点相比于宏:

1、避免了宏的缺点:需要预编译。因为inline内联函数也是函数,不需要预编译。
2、编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。
3、可以使用所在类的保护成员及私有成员。

inline内联函数的说明

1、内联函数只是我们向编译器提供的申请,编译器不一定采取inline形式调用函数。
2、内联函数不能承载大量的代码。如果内联函数的函数体过大,编译器会自动放弃内联。
3、内联函数内不允许使用循环语句或开关语句。
4、内联函数的定义须在调用之前。

本文来自于:https://www.jianshu.com/p/d557b0831c6a

上一篇下一篇

猜你喜欢

热点阅读