内联函数 inline

内联函数的预编译指令

  • #define CG_INLINE static inline
  • inline
  • 在inline加上static修饰符,只是为了表明该函数只在该文件中可见!也就是说,在同一个工程中,就算在其他文件中也出现同名、同参数的函数也不会引起函数重复定义的错误!
  • CoreGraphics里的内联函数,在函数前声明后编译器执行起来更具效率,使宏的定义更节省,不涉及栈的操作。(这句话出自这里CG_INLINE note)
  • CG_INLINE:
    It is a #define for static inline. This causes the compiler to create the code for the function inline, rather that creating a function call on the stack. See here and here for more information.
    <br />

为什么引入内联函数

  • 引入内联函数是为了解决函数调用效率的问题
  • 由于函数之间的调用,会从一个内存地址调到另外一个内存地址,当函数调用完毕之后还会返回原来函数执行的地址。函数调用会有一定的时间开销,引入内联函数就是为了解决这一问题
    <br />

如何提升函数调用效率

汇编中可以发现:使用内联与否,直接影响汇编代码中是否出现 call 指令:
call指令就是就需要:
(1)将下一条指令的所在地址(即当时程序计数器PC的内容)入栈
(2)并将子程序的起始地址送入PC(于是CPU的下一条指令就会转去执行子程序)
参看ios内联函数 inline

ios 开发中使用内联函数

  • 定义:
    有函数的结构,但不具备函数的性质,类似于宏替换。代码中使用inline定义,能否形成内联函数,还要看编译器对内联函数体内部的定义的具体处理。

  • 产生的动机:
    消除函数调用产生的开销,适合与小内存函数,频繁执行的函数。

  • 注意事项:
    不能使用循环语句;不能使用开关语句;不能使用递归调用;定义在第一次调用之前;

  • 结合使用的问题:
    static inline fun_returnType Fun_name(param...){}
    static 标识此内联联函数只能在本文件中使用,限制了内联函数的作用域。相对于宏来说,static inline具有和宏同样级别的开销,而且还提供了类型安全,没有长度和格式的具体限制。

推荐阅读更多精彩内容

  • inline 在iOS中的一些框架中,static inline是经常出现的关键字组合. static自不用多说,...
    崔玉和阅读 16,320评论 18 88
  • 代码(OC): -(NSUInteger)retainCount{ returnNSExtraRefCount(s...
    nalis风阅读 302评论 0 2
  • 在iOS中的一些框架中,static inline是经常出现的关键字组合. static自不用多说,表示在当前文件...
    张霸天阅读 321评论 0 0
  • 一次在项目中看见这样的code 搜索一下inline发现叫内联函数,当然static inline同常是成对出现的...
    Feng海阅读 168评论 0 0
  • 暑假,老爸因为办事,做了一些有关法律的文件,可我们家都是法盲,老爸找朋友才搞定。 于是乎老爸就有感慨了,儿子啊,你...
    缘卷逢启阅读 79评论 0 1