内联函数的预编译指令
-
#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具有和宏同样级别的开销,而且还提供了类型安全,没有长度和格式的具体限制。