zoukankan      html  css  js  c++  java
  • iOS OC内联函数 inline的详解

    inline

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

    • static自不用多说,表示在当前文件中应用,如 static A, 在其它文件中也可以出现static A.不会导致重名的错误.
    • inline.内联函数.
      • 作用:替代宏.

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

      • 在框架中出现inline时,如YYKit框架.我们稍加观察就会发现它出现在.h文件中. such as:
    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可以:

    • 解决函数调用效率的问题:
      • 函数之间调用,是内存地址之间的调用,当函数调用完毕之后还会返回原来函数执行的地址。函数调用有时间开销,内联函数就是为了解决这一问题。
      • 不用inline修饰的函数, 汇编时会出现 call 指令.调用call指令就是就需要:
        • (1)将下一条指令的所在地址入栈
        • (2)并将子程序的起始地址送入PC(于是CPU的下一条指令就会转去执行子程序).

    结论

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

      • 1) inline函数避免了普通函数的,在汇编时必须调用call的缺点:取消了函数的参数压栈,减少了调用的开销,提高效率.所以执行速度确比一般函数的执行速度要快.

      • 2)集成了宏的优点,使用时直接用代码替换(像宏一样);

    • 优点相比于宏:

      • 1)避免了宏的缺点:需要预编译.因为inline内联函数也是函数,不需要预编译.

      • 2)编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。

      • 3)可以使用所在类的保护成员及私有成员。

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

    参考资料:

    http://stackoverflow.com/questions/11985307/static-extern-and-inline-in-objective-c

    http://tigcc.ticalc.org/doc/gnuexts.html#SEC93



    文/凡路(简书作者)
    原文链接:http://www.jianshu.com/p/d557b0831c6a
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 相关阅读:
    webpack loader和插件的编写原理
    vue和react原理性知识点
    详谈Javascript类与继承
    vue项目中要实现展示markdown文件[转载]
    前端知识总结--2 js部分
    前端知识总结--html
    react相关知识点总结
    优秀文章
    项目部署服务器2
    项目部署服务器
  • 原文地址:https://www.cnblogs.com/wyk19910103/p/5660627.html
Copyright © 2011-2022 走看看